我正在尝试将列表传递给 Lisp 中的函数,并在函数中更改该列表的内容而不影响原始列表。我读过 Lisp 是按值传递的,这是真的,但还有一些我不太明白的事情。例如,此代码按预期工作:
(defun test ()
(setf original '(a b c))
(modify original)
(print original))
(defun modify (n)
(setf n '(x y z))
n)
如果您调用 (test),即使 (modify) 返回 (xyz),它也会打印 (abc)。
但是,如果您尝试仅更改列表的一部分,则不会这样。我认为这与具有相同内容的列表在任何地方的内存中都相同或类似的东西有关?这是一个例子:
(defun test ()
(setf original '(a b c))
(modify original)
(print original))
(defun modify (n)
(setf (first n) 'x)
n)
然后(测试)打印(xbc)。那么如何更改函数中列表参数的某些元素,就好像该列表是该函数的本地一样?