2010-12-08 18 views
5

दो सवाल:आम-लिस्प में, मैं किसी तत्व को किसी सूची में कैसे डाल सकता हूं?

1.I एक समारोह में जगह एक सूची के अंदर एक तत्व सम्मिलित करना चाहते हैं (किसी भी स्थिति लेकिन सूची की शुरुआत में, कारण के लिए प्रश्न 2 देखें) ऐसी है कि:

CL> (defun insert-in-place (the-list after-position new-element) ....) => ... 
CL> (setf testy-list (list 'a 'b 'c 'd)) => ... 
CL> testy-list => ('A 'B 'C 'D) 
CL> (insert-in-place testy-list 1 'BOOOO) => ... 
CL> testy-list => ('A 'B 'BOOOO 'C 'D) 

2. मुझे लगता है कि सूची में सूची की शुरुआत में एक तत्व डालना एक समारोह के माध्यम से असंभव है क्योंकि तर्क मूल्य से पारित होते हैं, इसलिए जब सूची का पहला विपक्ष सेल पारित होता है, तो यह मूल्य से गुजरता है और यह एक प्रतिलिपि है और इसलिए अपनी कार बदलना केवल एक प्रतिलिपि कार बदलता है, मूल नहीं, हालांकि निम्नलिखित विपक्षी कोशिकाओं को साझा किया जाता है और जगह में बदलना संभव है। क्या मैं सही हूँ?

उत्तर

8

1) यहाँ यह है:

(defun insert-after (lst index newelt) 
    (push newelt (cdr (nthcdr index lst))) 
    lst) 
(insert-after '(a c d) 0 'b) => (A B C D) 

2) विपक्ष कोशिकाओं के विनाशकारी संशोधन:

(setf testy-list '(a bar)) 
(defun modify (list) 
    (setf (first list) 'foo)) 
(modify testy-list) 
testy-list => (FOO BAR) 

यह 'foo के लिए सबसे पहले विपक्ष सेल की कार सेट।

+0

धन्यवाद। प्रश्न 2 के बारे में: जब आप कॉल (सूची-सूची संशोधित) को संशोधित करने के लिए वास्तव में क्या पारित किया जा रहा है? एक मूल्य या इसके संदर्भ के रूप में परीक्षण सूची का पहला विपक्ष सेल? मेरा मतलब है कि आपने जवाब दिया कि मैं सही नहीं हूं लेकिन मुझे प्रश्न 2 के बारे में मेरे तर्क में दोष नहीं मिल रहा है ... – Paralife

+0

इसके अलावा मैंने इसे अपने आप कर लिया: (rplacd (nthcdr स्थिति lst) (विपक्षी elem (nthcdr (+ 1 स्थिति) lst))) लेकिन आपका बेहतर है। वास्तव में मैं nthcdr को सेट करना चाहता था, लेकिन मैं जिस क्लिनप का उपयोग करता हूं, में nthcdr सेट करने योग्य नहीं है। मुझे आश्चर्य है कि यह इसे सेट करने योग्य है या नहीं। मेरा दूसरा प्रश्न देखें: http://stackoverflow.com/questions/4387967/does-a-setfable-nthcdr-implementation-exist – Paralife

+0

प्रश्न 2 के बारे में: जब आप कॉल (टेस्टी-सूची संशोधित करें) करते हैं, तो आप एक विपक्ष सेल को पास करते हैं ("संदर्भ से")। – koddo

0

मैंने इसे अपनी परियोजना के लिए बनाया है, इंडेक्स 0 को संभालता है और यदि सूचकांक सूची की लंबाई से अधिक है, तो नया आइटम सूची के अंत में जोड़ा जाता है। ध्यान रखें कि यह एक नई सूची बनाता है ताकि यह आपके लिए लागू न हो। मैं उम्मीद करता हूं कि यह किसी के लिए उपयोगी होगा।

(defun list-insert-at (lst index new-value) 
    (let ((retval nil)) 
    (loop for i from 0 to (- (length lst) 1) do 
     (when (= i index) 
     (push new-value retval)) 
     (push (nth i lst) retval)) 
    (when (>= index (length lst)) 
     (push new-value retval)) 
    (nreverse retval))) 

CL-USER> test 
(1 2 3 4 5) 
CL-USER> (list-insert-at test 5 'a) 
(1 2 3 4 5 A) 
CL-USER> (list-insert-at test 0 'a) 
(A 1 2 3 4 5) 
संबंधित मुद्दे

 संबंधित मुद्दे