gpt4 book ai didi

common-lisp - Common Lisp共享结构困惑

转载 作者:行者123 更新时间:2023-12-04 02:56:11 31 4
gpt4 key购买 nike

我正在阅读《Practical Common Lisp》一书,在第 22 章第 284 页的脚注 5 中,我看到一段让我感到困惑的代码片段。

我知道变量list和tail有一个共同的列表结构,但我很困惑,既然tail每次迭代都会被赋值'new',为什么(setf (cdr tail) new)会影响变量列表的状态?

(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)

最佳答案

不变的是 tail 始终是 list 的最后一个 cons 单元。

在每次迭代中,都会创建一个新的 cons 单元格,将新值保存为 car。第一次,list 被设置到这个 cons 单元格,tail 也是。在所有后续迭代中,通过将最后一个单元格的 cdr 设置到新的 cons 单元格,然后将 tail 设置到新单元格来附加新的 cons 单元格,以重新创建不变量。

第一次迭代后:

 [ 0 | nil ]
^- list
^- tail

秒后:

 [ 0 | -]--->[ 1 | nil ]
^- list ^- tail

第三:

 [ 0 | -]--->[ 1 | -]--->[ 2 | nil ]
^- list ^- tail

关于common-lisp - Common Lisp共享结构困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56184854/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com