我正在阅读实用公共lisp ,并对Lisp的COPY-TREE函数有一个问题。

本书给出了调用

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

解释后,这本书发表了这个声明:

原始引用原子值的CONR单元 副本中的相应缺点单元格将引用相同的值。 因此,唯一由原始树引用的对象和 复制树生成的副本是数字5,6和符号 nil。

但这对我来说并不意义。我认为所有原子将在原始和新的内部共享。因此,我期望在原始和副本之间共享1,2,3,4,5,6和nil,并且唯一的“新对象”将是所有CONS单元格。

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

谢谢。

有帮助吗?

解决方案

我检查Web版本,PDF版本和硬封面。前两个是错误的。硬覆盖状态(粗体强调是我的):

在原始引用原子值中的CON单元格中,副本中的相应CON单元格将引用相同的值。因此,唯一由原始树引用的对象和由复制树生成的副本是数字 1-6 ,符号为nil。

所以硬封面书是正确的。

其他提示

稍微复杂。

将复制COLL单元格。通常,FIN单元格引用的对象将不会被复制。

但有一个例外。像Fixnums和字符等数据可以在CONS单元(和结构插槽,类插槽,阵列)内存中内联。这种数据类型不一定是EQ。这就是为什么有EQL。

说明是正确的,该示例不是。 copy-tree 将返回1,2和3,仅复制cons细胞。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top