gpt4 book ai didi

方案 - 定义列表与符号

转载 作者:行者123 更新时间:2023-12-01 02:40:10 25 4
gpt4 key购买 nike

我试图找出在 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 中定义为列表?还是一个符号?

谢谢。

最佳答案

文字列表( '(foo bar baz) ,而不是 (list 'foo 'bar 'baz) )是 not allowed to be mutated .如果你这样做,那“是一个错误”(即行为是未定义的)。

在这种情况下,您观察到的是文字 '(he said:)被一遍又一遍地重用,并理解它不会发生变异。由于您违反了该理解,因此您会看到奇怪的行为。

相反,当您使用 (list 'he 'said:) 时,每次都会返回一个新列表。

关于方案 - 定义列表与符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8687700/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com