在DrRacket玩弄Racket时,我意外地进入了 互动窗口。
(定义x 7)
(定义x 8)
和DrRacket允许它,即我没有得到“重复的定义 标识符错误消息。
所以试着找出发生了什么我然后进入了 DrRacket的定义窗口:
代码段A
(define-namespace-anchor a)
(define ns (namespace-anchor->namespace a))
(eval '(begin (define x 7) (define x 8)) ns)
(eval 'x ns)
仍然没有“重复定义错误”。
然后我在定义窗口中尝试了这个:
代码段B
(define x 9)
(define-namespace-anchor a)
(define ns (namespace-anchor->namespace a))
(eval '(begin (define x 7) (define x 8)) ns)
(eval 'x ns)
我收到了错误消息:cannot redefine a constant x
。
有人可以在定义窗口中向我解释为什么在代码段A中
(并且只需在交互窗口中输入(define x 7)
后跟(define x 8)
)就不会给我一个重复的定义错误。
答案 0 :(得分:9)
历史上,Scheme(不是Racket)总是允许重新定义。顶层的重新定义等同于现有绑定的变异。 Racket已经收紧了一点,因为模块顶层的代码不允许重新定义标识符。但是,旧的行为仍然存在于用于“eval”和交互窗口的“顶层”中。
我可能会在这里遗漏细节,但我相信我告诉你的一切都是真的。
答案 1 :(得分:3)
马修弗拉特在邮件列表上有这个答案的解释: http://www.mail-archive.com/users@racket-lang.org/msg09340.html