Scheme 设置方案中的模糊和混叠

Scheme 设置方案中的模糊和混叠,scheme,Scheme,我在理解方案中似乎不一致的破坏性操作时遇到问题。这就是为什么在下面的示例中条形图没有改变 (define foo '(a b)) (define bar foo) (set! foo '(c d)) foo >(c d) bar >(a b) 但是,这会通过更改foo来更改条 (define foo '(a b)) (define bar foo) (set-car! foo 'c) foo >(c b) bar >(c b) 如果我理解正确的话,在两个例子中,bar

我在理解方案中似乎不一致的破坏性操作时遇到问题。这就是为什么在下面的示例中条形图没有改变

(define foo '(a b))
(define bar foo)
(set! foo '(c d))
foo
>(c d)
bar
>(a b)
但是,这会通过更改foo来更改条

(define foo '(a b))
(define bar foo)
(set-car! foo 'c)
foo
>(c b)
bar
>(c b)

如果我理解正确的话,在两个例子中,bar都是用它的“汽车”指向foo,但在使用set时,老foo并没有改变!在第一个。我在任何地方都找不到关于如何以及为什么会发生这种情况的答案。

define
生成一个变量。计算为对象位置的名称

(define foo (list 'a 'b))
这里的
foo
可能指向地址
240
。当计算
foo
时,您将返回
240
,因此
(定义条形foo)
将生成指向内存中相同对象的第二个变量。REPL中没有显示地址,因此您将使用se
(a b)
,因为REPL打印地址
240中的内容

内存中的这个对象是一个
cons
,因此每个都只是指向内存中其他值的两个指针。因此,当您这样做时:

(将汽车设置为foo'c)
通过将
car
指针从
a
的地址表示形式更改为
c
的地址表示形式,您正在更改位于地址240的CON。由于
foo
bar
都指向地址
240
处的同一cons单元格,它们都将得到更改,因为它们指向相同的数据

如果您使用
set仅更改名称指向的值:

(set!foo(cons'd(cdr foo)))
现在,这将把指向
240
的变量指针更新到其他地址。因此,您可以计算
foo
bar
并查看它们是不同的值:

foo;==>(d b)
条形图;==>(c)b)
此处
foo
可能位于地址
256
中。由于我们在
foo
中使用了旧值
cdr
,我们知道这些值的尾部是相同的:

(cdr-foo);=>(b)
(平衡)(cdr-foo)(cdr-bar));=>#T
如果你
设置
编码为不同的值:

(设置!bar foo)
现在
foo
bar
都指向
256
,如果不再使用
240
,该位置的对可能会被垃圾收集,但由于原始
foo
cdr
cdr
,让我们说地址
248
,该地址不会被垃圾收集,因为它由地址
256
中的
cons
指向

注意:我已经更改了
foo
的定义,因为不允许
设置像
'(a b)
这样的car
文本,因为它们是不可变的<代码>(列表“a”b)
每次执行该行代码时,都会创建一个新的列表,您可以确信该地址不会在例如
”(d a b)
中重复使用


NB2:Scheme报告尽最大努力避免口述如何存储值。因此,他们在报告中不使用概念地址。Scheme和CL模型的大多数实现的数据非常相似

define
生成一个变量。计算为对象位置的名称

(define foo (list 'a 'b))
这里的
foo
可能指向地址
240
。当计算
foo
时,您将返回
240
,因此
(定义条形foo)
将生成指向内存中相同对象的第二个变量。REPL中没有显示地址,因此您将使用se
(a b)
,因为REPL打印地址
240中的内容

内存中的这个对象是一个
cons
,因此每个都只是指向内存中其他值的两个指针。因此,当您这样做时:

(将汽车设置为foo'c)
通过将
car
指针从
a
的地址表示形式更改为
c
的地址表示形式,您正在更改位于地址240的CON。由于
foo
bar
都指向地址
240
处的同一cons单元格,它们都将得到更改,因为它们指向相同的数据

如果您使用
set仅更改名称指向的值:

(set!foo(cons'd(cdr foo)))
现在,这将把指向
240
的变量指针更新到其他地址。因此,您可以计算
foo
bar
并查看它们是不同的值:

foo;==>(d b)
条形图;==>(c)b)
此处
foo
可能位于地址
256
中。由于我们在
foo
中使用了旧值
cdr
,我们知道这些值的尾部是相同的:

(cdr-foo);=>(b)
(平衡)(cdr-foo)(cdr-bar));=>#T
如果你
设置
编码为不同的值:

(设置!bar foo)
现在
foo
bar
都指向
256
,如果不再使用
240
,该位置的对可能会被垃圾收集,但由于原始
foo
cdr
cdr
,让我们说地址
248
,该地址不会被垃圾收集,因为它由地址
256
中的
cons
指向

注意:我已经更改了
foo
的定义,因为不允许
设置像
'(a b)
这样的car
文本,因为它们是不可变的<代码>(列表“a”b)
每次执行该行代码时,都会创建一个新的列表,您可以确信该地址不会在例如
”(d a b)
中重复使用

NB2:Scheme报告尽最大努力避免口述如何存储值。因此,他们在报告中不使用概念地址。Scheme和CL模型的大多数实现的数据非常相似
(set! foo (list 'c 'd))
(set-car! foo 'c)