Common lisp 公共Lisp';s复制树:原始和副本将共同引用哪些对象?

Common lisp 公共Lisp';s复制树:原始和副本将共同引用哪些对象?,common-lisp,practical-common-lisp,Common Lisp,Practical Common Lisp,我正在阅读,对Lisp的COPY-TREE函数有一个问题 这本书给出了打电话的例子 (copy-tree '( '(1 2) '(3 4) '(5 6))) 在解释之后,本书做出如下声明: 如果原始单元格中的cons单元格引用了原子值 副本中相应的cons单元格将引用相同的值。 因此,只有原始树和 复制树生成的副本是数字5、6和符号 零 但这对我来说没有意义。我以为所有的原子都会在原版和新版之间共享。因此,我希望1、2、3、4、5、6和NIL都将在原始和副本之间共享,并且唯一的“新对象”将是所

我正在阅读,对Lisp的
COPY-TREE
函数有一个问题

这本书给出了打电话的例子

(copy-tree '( '(1 2) '(3 4) '(5 6)))
在解释之后,本书做出如下声明:

如果原始单元格中的cons单元格引用了原子值 副本中相应的cons单元格将引用相同的值。 因此,只有原始树和 复制树生成的副本是数字5、6和符号 零

但这对我来说没有意义。我以为所有的原子都会在原版和新版之间共享。因此,我希望1、2、3、4、5、6和NIL都将在原始和副本之间共享,并且唯一的“新对象”将是所有CONS单元格

哪一个是正确的,为什么


谢谢。

描述正确,示例不正确。将按原样返回1、2和3,只复制
cons
单元格。

稍微复杂一些

将复制cons单元格。通常不会复制cons单元格引用的对象


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

我检查了web版本、pdf版本和硬封面。正如你所说,前两个是错误的。硬封面上写着(我用粗体强调):

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


因此,这本精装书是正确的。

那么,这是否意味着,最终,原始树和副本将共享以下所有内容:1、2、3、4、5、6和零?换句话说,这是否意味着这本书在这种情况下是错误的?@CharlieFlowers:没错,这本书是错误的。只有conses被复制了。这是有道理的,但我仍然不明白他为什么要区分“5,6和NIL”和“1,2,3和4”。此外,如果原子是更复杂的对象,不符合内联存储条件,那么原始和副本之间会共享什么?@Charlie Flowers:所有cons单元格都将被复制。所有非基本数据都将被引用,而不会被复制。在我看来,彼得试图解释
COPY-LIST
COPY-TREE
之间的区别。假设我现在有,我会说他确实正确地解释了这一区别,但随后他抛出了一个关于5、6和零的错误陈述,这让他的解释产生了混乱。尽管令人惊讶。。。你可能会认为精装本是3的最老版本。这会让人相信它最初说的是“1-6和零”,后来有人故意把它改为“5,6和零”。(不管是哪种方式,我至少可以自信地认为,复制树并没有我未能把握的神秘之处)。