我试图找出Scheme中发生的一些有趣的事情:
(define last-pair
(lambda (x)
(if (null? (cdr x))
x
(last-pair (cdr x)))))当我这样定义foo时:
(define foo
(lambda ()
(let ((s (list 'he 'said:)))
(set-cdr! (last-pair s)
(list 'ha 'ha))
s)))然后运行foo 3次,我得到了:
(he said: ha ha)
(he said: ha ha)
(he said: ha ha)但当我这样定义foo时:
(define foo
(lambda ()
(let ((s '(he said:)))
(set-cdr! (last-pair s)
(list 'ha 'ha))
s)))然后运行foo 3次,我得到了:
(he said: ha ha)
(he said: ha ha ha ha)
(he said: ha ha ha ha ha ha)但是为什么呢?我的第一个想法是在第一个foo中创建总是新的列表,而在第二个中我们不这样做,但我不明白它是如何工作的。方案在第二个foo中定义地址,然后做什么?它是否也在第二个foo中定义为列表?或者是一个符号?
谢谢。
发布于 2012-01-01 01:22:08
文字列表(与(list 'foo 'bar 'baz)相对的是'(foo bar baz))是not allowed to be mutated。如果你这样做了,这“是一个错误”(即,行为是未定义的)。
在这种情况下,您观察到的是文字'(he said:)被一次又一次地重用,并理解它不会发生变化。既然你违反了这个理解,你就会得到你所看到的奇怪的行为。
相反,当您使用(list 'he 'said:)时,每次都会返回一个新的列表。
https://stackoverflow.com/questions/8687700
复制相似问题