有人可以解釋以下行為嗎?具體來說,為什么函數每次都返回不同的列表?為什么沒有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
提交
取消