मैं लिस्प में किसी फ़ंक्शन में एक सूची पास करने का प्रयास कर रहा हूं, और उस सूची की सामग्री को मूल सूची को प्रभावित किए बिना फ़ंक्शन के भीतर बदल सकता हूं। मैंने पढ़ा है कि लिस्प पास-दर-मूल्य है, और यह सच है, लेकिन कुछ और चल रहा है जिसे मैं समझ में नहीं आता। उदाहरण के लिए, इस कोड काम करता है के रूप में उम्मीद:सामान्य-लिस्प में, मैं मूल सूची को बदले बिना फ़ंक्शन के भीतर से सूची पैरामीटर का हिस्सा कैसे संशोधित करूं?
(defun test()
(setf original '(a b c))
(modify original)
(print original))
(defun modify (n)
(setf n '(x y z))
n)
आप (परीक्षण) कॉल करते हैं, यह प्रिंट (एक ख ग) भले ही (संशोधित) रिटर्न (X Y Z)।
हालांकि, अगर आप सूची का केवल एक हिस्सा बदलने की कोशिश करते हैं तो यह इस तरह से काम नहीं करता है। मुझे लगता है कि इसमें सूचियों के साथ कुछ करने के लिए कुछ है जो वही सामग्री हर जगह मेमोरी में समान है या ऐसा कुछ है? यहां एक उदाहरण दिया गया है:
(defun test()
(setf original '(a b c))
(modify original)
(print original))
(defun modify (n)
(setf (first n) 'x)
n)
फिर (परीक्षण) प्रिंट (x b c)। तो मैं फ़ंक्शन में सूची पैरामीटर के कुछ तत्व कैसे बदलूं, जैसे कि उस सूची में वह सूची स्थानीय थी?
ध्यान दें कि शाब्दिक स्थिरांक को संशोधित करने के परिणामों अपरिभाषित है। ऐसा मत करो। कभी नहीँ। '(ए बी सी) आपके कोड में एक शाब्दिक स्थिर है। आपको इसे संशोधित नहीं करना चाहिए। आप सूची सूची के साथ बनाए गए सूचियों को संशोधित कर सकते हैं (सूची 'ए' बी 'सी)। –
यह भी ध्यान दें कि (एसईटीएफ मूल '(ए बी सी)) कोई समझ नहीं आता है। एसईटीएफ वैरिएबल पेश नहीं करता है।चर 'मूल' कहीं भी परिभाषित नहीं है। आप LET, DEFUN, DEFVAR, DEFPARAMETER के माध्यम से पेश किए गए चर सेट कर सकते हैं ... –