为什么推送的元素没有出现在原始列表中?

问题描述 投票:0回答:1

我正在尝试查看 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)?

common-lisp
1个回答
0
投票

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)

© www.soinside.com 2019 - 2024. All rights reserved.