常见的LISP的Copy-tree:由原始和副本共同引用哪些对象?
-
13-12-2019 - |
题
我正在阅读实用公共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
细胞。
不隶属于 StackOverflow