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)