我正在尝试查看 Lisp 推送功能对子列表的效果。
我有一个 Common Lisp 代码段如下:
(defvar l2)
(defvar tl2)
(setq l2 '(1 2 3))
(setq tl2 (cdr l2))
(push 5 tl2)
(print tl2)
(print l2)
我希望最后一次打印能够打印列表(1 5 2 3)。但是,它只打印 (1 2 3)。如果tl2是原列表的子列表(2 3)并且push就地,为什么原列表没有变成(1 2 5 3)?
Lisp 列表是单链接的 cons 单元,内容为末尾为 NIL。
如果您将某些内容放在列表的开头,它会创建一个新的 cons 单元,其中 cdr/rest 指向另一个列表。它不会改变任何其他缺点单元格。
l2 -> (a . (b . (c . NIL)))
tl2 ^
(按 'z tl2)
tl2 -> (z . ^)
(打印 tl2)->(z a b c)
(打印l2)->(a b c)