在Racket中eval中允许的标识符重复定义?

时间:2011-11-19 00:29:31

标签: scheme racket

在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))就不会给我一个重复的定义错误。

2 个答案:

答案 0 :(得分:9)

历史上,Scheme(不是Racket)总是允许重新定义。顶层的重新定义等同于现有绑定的变异。 Racket已经收紧了一点,因为模块顶层的代码不允许重新定义标识符。但是,旧的行为仍然存在于用于“eval”和交互窗口的“顶层”中。

我可能会在这里遗漏细节,但我相信我告诉你的一切都是真的。

答案 1 :(得分:3)

马修弗拉特在邮件列表上有这个答案的解释:  http://www.mail-archive.com/users@racket-lang.org/msg09340.html