Scheme SICP中不一致的方框图和指针图

Scheme SICP中不一致的方框图和指针图,scheme,lisp,sicp,Scheme,Lisp,Sicp,图3.16和3.17中的计算机程序(SICP)方框图和指针图的结构和解释看起来并不相同(仅就值而言,而不是内存而言),即使它说它们是相等的。(“当被认为是一个列表时,z1和z2都代表“相同的”列表,((a b)a b))”,第258页) SICP对z1进行了如下图示: z2是这样的: 这对中的箭头z1,似乎并不都指向整对x。它们甚至都没有指向同一个对象,尽管它们都收到了相同的(内存和值)对。 我将评估第一个图为(ab),第二个图为((ab)ab) 我猜每个箭头实际上都指向整对,x,但在第98

图3.16和3.17中的计算机程序(SICP)方框图和指针图的结构和解释看起来并不相同(仅就值而言,而不是内存而言),即使它说它们是相等的。(“当被认为是一个列表时,
z1
z2
都代表“相同的”列表,
((a b)a b))
”,第258页)

SICP对z1进行了如下图示:

z2是这样的:

这对中的箭头
z1
,似乎并不都指向整对
x
。它们甚至都没有指向同一个对象,尽管它们都收到了相同的(内存和值)对。 我将评估第一个图为
(ab)
,第二个图为
((ab)ab)

我猜每个箭头实际上都指向整对,
x
,但在第98页的图2.3中:

它通过指向侧面或两个项目之间,非常清楚地指向整个盒子


我是否错误地理解了方框图和指针图,或者完全理解了其他内容?

您读得太多了。:-)如果它指向框中的任何位置,则假定它是指向该单元格的指针。您不能特别指出
汽车
cdr
部分。

您最后的假设是正确的。点表示指针值所在的位置,箭头指向的整个双框就是目标。不管它是指向侧面、中上、左上还是右上。它的整个对是对象的“地址”

如果不使用
car
cdr
访问对象的一部分,则无法指向对象的一部分。第二次你这样做,你就有了它指向的任何东西,而不是一个间接的指针<代码>(汽车(a/b));=>a和
a
在被垃圾收集之前,没有任何仍然指向它的列表本质

我们可以这样来说明:

[=#1|#3|#2]
[=#2|#3|()] 
[=#3|a |#4]
[=#4|b |()]
带有=#的第一个值是框本身的位置,而接下来的两个值是
car
cdr
。上面,
x
指向地址#3,
z1
指向地址#1。让我们制作
z2

[=#5|#6|#8]
[=#6|a |#7] 
[=#7|b |()] 
[=#8|#9|()]
[=#9|a |#10]
[=#10|b |()]
正如您所看到的,
z2
z1
多使用了两个
cons
,因为它不会将同一对象作为其列表的两个元素重复使用,而是使用单个外观相似的列表

在图纸中,
z1
car
cdr
都指向相同的列表
x
z2
指向两个不同的列表,但这些列表中的元素相同

原因是符号是单态的。因此,
a
只有一个符号对象,在两个不同的位置计算
'a
都将指向相同的
a
。其他单身人士包括
#f
#t
()

cons
总是创建一个新的对,而
list
只是一个将参数组合在一起的过程。因此,表达式中相同的代码(列表“a”b)两个位置使两个不同的对象看起来完全相同

(eq? (car z1) (cdr z1))    ; ==> #t same object
(eq? (car z2) (cdr z2))    ; ==> #f not same object
(equal? (car z2) (cdr z2)) ; ==> #t they look the same, but they are not the same. (created at different places)
引用的数据可以看作是在程序启动之前一次创建的。因此,这是未定义的

(eq? '(a b) '(a b))         ; ==> #t or #f (undefined)
(eq? '(b c) (cdr '(a b c))) ; ==> #t or #f (undefined)

原因是Scheme允许但没有义务以与结构
z1
相同的方式重用数据

为什么你不能特别指出一辆车或一对cdr?只是约定?Scheme(和Lisp)不是C;它本身没有地址。它有对象引用(概念上)总是引用整个对象,而不是其中的一部分。因此,对cons单元格的对象引用指的是整个cons单元格(即使它通常被实现为指向cons单元格起始位置的指针),对字符串的对象引用指的是整个字符串(而不是字符串中的单个字符),对向量的对象引用指的是整个向量,等等。
(eq? '(a b) '(a b))         ; ==> #t or #f (undefined)
(eq? '(b c) (cdr '(a b c))) ; ==> #t or #f (undefined)