Common Lisp的复制树:原始和副本将共同引用哪些对象?

时间:2012-10-03 20:27:51

标签: common-lisp practical-common-lisp

我正在阅读Practical Common Lisp,并对Lisp的COPY-TREE函数提出疑问。

这本书给出了调用

的例子
(copy-tree '( '(1 2) '(3 4) '(5 6)))

在解释之后,这本书发表了这样的声明:

  

当原始的cons单元格引用原子值时,   副本中相应的cons单元格将引用相同的值。   因此,原始树和共同引用的唯一对象   COPY-TREE生成的副本是数字5,6和符号   NIL。

但这对我没有意义。我认为所有原子将在原始和新的之间共享。因此,我预计原始版本和副本之间将共享1,2,3,4,5,6和NIL,并且唯一的“新对象”将是所有CONS细胞。

哪一个是正确的,为什么?

感谢。

3 个答案:

答案 0 :(得分:5)

我查看了网络版,pdf版和硬封面。你说的前两个是错的。硬封面说明了这一点(大胆强调是我的):

  

如果原始的cons单元格引用了原子值,则副本中相应的cons单元格将引用相同的值。因此,原始树和COPY-TREE生成的副本共同引用的唯一对象是数字 1-6 ,符号为NIL。

所以硬封面书是正确的。

答案 1 :(得分:4)

稍微复杂一些。

将删除缺陷单元格。通常,cons单元引用的对象不会被复制。

但有一个例外。像fixnums和characters这样的数据可以内联存储在cons单元格(以及结构槽,类槽,数组)中。这些数据类型不一定是EQ。这就是为什么有EQL。

答案 2 :(得分:1)

描述是正确的,例子不是。 copy-tree将按原样返回1,2和3,仅复制cons个单元格。