我正在阅读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细胞。
哪一个是正确的,为什么?
感谢。
答案 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
个单元格。