我是 common lisp 的新手,所以希望有人能向我澄清这一点:
假设我们有一个列表并想要添加一个项目push
修改它:
CL-USER> (defparameter xx '(1 2 3))
XX
CL-USER> xx
(1 2 3)
CL-USER> (push 100 xx)
(100 1 2 3)
CL-USER> xx
(100 1 2 3)
正如预期的那样。但是当我尝试对该函数执行相同操作时,它不会修改列表:
CL-USER> (defun push-200 (my-list)
(push 200 my-list))
PUSH-200
CL-USER> (push-200 xx)
(200 100 1 2 3)
CL-USER> xx
(100 1 2 3)
所以我尝试比较参数和我的列表,如下所示:
CL-USER> (defun push-200 (my-list)
(format t "~a" (eq my-list xx))
(push 200 my-list))
WARNING: redefining COMMON-LISP-USER::PUSH-200 in DEFUN
PUSH-200
CL-USER> (push-200 xx)
T
(200 100 1 2 3)
CL-USER> xx
(100 1 2 3)
它说对象是相同的。
所以问题是:我在这里忽略了什么?
(defun push-200 (my-list)
(push 200 my-list))
这修改了变量my-list
。该变量现在指向一个新的cons.
基本上是:(setq my-list (cons 200 my-list)
.
(push-200 xx)
Common Lisp 评估xx
到一个值并将列表传递给push-200
. xx
传递的不是它的值,而是它的值。所以,Lisp系统无法修改xx
指出一个不同的缺点,因为它没有通过。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)