【发布时间】:2012-06-08 18:20:40
【问题描述】:
the Seasoned Schemer pg 150 中的以下函数通过改变每个列表的 cdr 然后检查更改是否影响两者来确定两个列表是否具有相同的身份(即占用相同的内存):
(define same?
(lambda (c1 c2)
(let ((t1 (cdr c1))
(t2 (cdr c2)))
(set-cdr! c1 1)
(set-cdr! c2 2)
(let ((v (= (cdr c1) (cdr c2))))
(set-cdr! c1 t1)
(set-cdr! c2 t2)
v))))
现在,如果我将a_list 定义如下:
(define a_list (list 'a 'b 'c 'd))
并评估
(same? a_list (cdr a_list))
函数返回#f,并且调试器(Racket 博士)确认这两个列表——它们应该共享它们的大部分成员,因为第二个参数是第一个参数的真子集——实际上有不同相同成员的副本。这怎么可能?!
稍微改变一下这个想法:
(set-cdr! (cddr a_list) a_list)
现在a_list 是周期性的。如果我用same? 测试这个函数,它只会在两个参数同相时注册#t,即(same? a_list a_list) 和(same? a_list (cdddr a_list))。
[编辑答案位于已接受帖子评论链的底部]
【问题讨论】:
标签: scheme the-little-schemer seasoned-schemer