在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)
Run Code Online (Sandbox Code Playgroud)
仍然没有"重复定义错误".
然后我在定义窗口中尝试了这个:
代码段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)
Run Code Online (Sandbox Code Playgroud)
我收到了错误消息:cannot redefine a constant x.
有人可以向我解释为什么在定义窗口中的代码片段A(并且只是在交互窗口中输入 (define x 7) 后面(define x 8))不会给我一个重复的定义错误.
从历史上看,Scheme(不是Racket)总是允许重新定义.顶层的重新定义等同于现有绑定的变异.Racket已经收紧了一点,因为模块顶层的代码不允许重新定义标识符.但是,旧的行为仍然存在于用于"eval"和交互窗口的"顶级"中.
我可能会在这里遗漏细节,但我相信我告诉你的一切都是真的.