为什么此函数每次都返回不同的值?

有人可以解释以下行为吗?具体来说,为什么函数每次都返回不同的列表?为什么没有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)每次输出该功能,建议的实现此功能的方法是什么?


狐的传说
浏览 535回答 3
3回答

米脂

'(0 0 0)是一个文字对象,假定它是一个常量(尽管不受修改)。因此,您每次都在有效地修改同一对象。要在每个函数调用中创建不同的对象,请使用(list 0 0 0)。因此,除非您知道自己在做什么,否则应始终仅将文字列表(如'(0 0 0))用作常量。

慕神8447489

附带说明一下,在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这很好地提示了当前的问题。
打开App,查看更多内容
随时随地看视频慕课网APP