有人可以解释以下行为吗?具体来说,为什么函数每次都返回不同的列表?为什么没有some-list在'(0 0 0)每次调用该函数时进行初始化?(defun foo () (let ((some-list '(0 0 0))) (incf (car some-list)) some-list))输出:> (foo)(1 0 0)> (foo)(2 0 0)> (foo)(3 0 0)> (foo)(4 0 0)谢谢!编辑:另外,假设我希望'(1 0 0)每次输出该功能,建议的实现此功能的方法是什么?
3 回答
米脂
TA贡献1836条经验 获得超3个赞
'(0 0 0)
是一个文字对象,假定它是一个常量(尽管不受修改)。因此,您每次都在有效地修改同一对象。要在每个函数调用中创建不同的对象,请使用(list 0 0 0)
。
因此,除非您知道自己在做什么,否则应始终仅将文字列表(如'(0 0 0)
)用作常量。
慕神8447489
TA贡献1780条经验 获得超1个赞
附带说明一下,在sbcl REPL中定义此功能会收到以下警告:
caught WARNING:
Destructive function SB-KERNEL:%RPLACA called on constant data.
See also:
The ANSI Standard, Special Operator QUOTE
The ANSI Standard, Section 3.2.2.3
这很好地提示了当前的问题。
添加回答
举报
0/150
提交
取消