我在看Practical Common Lisp这本书,在第22章的脚注5,第284页,我看到了一段让我感到困惑的代码片段。
我知道变量 list 和 tail 有一个共同的列表结构,但我很困惑,因为 tail 在迭代期间每次都会被分配 'new' 的值,为什么 (setf (cdr tail) new) 会影响状态变量列表的?</p>
(do ((list nil) (tail nil) (i 0 (1+ i)))
((> i 10) list)
(let ((new (cons i nil)))
(if (null list)
(setf list new)
(setf (cdr tail) new))
(setf tail new)))
;;; => (0 1 2 3 4 5 6 7 8 9 10)