【发布时间】:2010-12-01 20:15:16
【问题描述】:
我正在尝试将列表传递给 Lisp 中的函数,并在函数中更改该列表的内容而不影响原始列表。我读过 Lisp 是按值传递的,这是真的,但还有一些我不太明白的事情。例如,此代码按预期工作:
(defun test ()
(setf original '(a b c))
(modify original)
(print original))
(defun modify (n)
(setf n '(x y z))
n)
如果您调用 (test),即使 (modify) 返回 (x y z),它也会打印 (a b c)。
但是,如果您尝试仅更改列表的一部分,则不会这样。我认为这与具有相同内容的列表在任何地方的内存中都相同或类似的东西有关?这是一个例子:
(defun test ()
(setf original '(a b c))
(modify original)
(print original))
(defun modify (n)
(setf (first n) 'x)
n)
然后(测试)打印(x b c)。那么如何更改函数中列表参数的某些元素,就好像该列表是该函数的本地一样?
【问题讨论】:
-
请注意,修改文字常量的后果是不确定的。不要那样做。绝不。 '(a b c) 是代码中的文字常量。你不应该修改它。您可以修改使用函数 LIST 创建的列表,例如 (list 'a 'b 'c) 。
-
还要注意 (SETF original '(a b c)) 没有意义。 SETF 不引入变量。变量'original'没有定义。可以设置已经通过 LET、DEFUN、DEFVAR、DEFPARAMETER、...引入的变量。
标签: function lisp common-lisp pass-by-reference parameter-passing