【问题标题】:Duplicate definition of identifiers allowed in eval in Racket?Racket中的eval中允许的标识符的重复定义?
【发布时间】:2011-11-19 00:29:30
【问题描述】:

在 DrRacket 中玩 Racket 时,我不小心进入了 交互窗口。

(定义 x 7)
(定义 x 8)

并且 DrRacket 允许它,即我没有得到“重复的定义 标识符错误消息。

所以为了弄清楚发生了什么我然后在 DrRacket 的定义窗口:

代码 sn-p A

(define-namespace-anchor a)  
(define ns (namespace-anchor->namespace a))  
(eval '(begin (define x 7) (define x 8)) ns)  
(eval 'x ns)  

仍然没有“重复定义错误”。

然后我也在定义窗口中尝试了这个:

代码 sn-p 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

有人可以向我解释为什么在定义窗口中的代码 sn-p A (也只需在交互窗口中输入(define x 7) 后跟(define x 8))不会给我一个重复定义错误。

【问题讨论】:

  • 等等...我很困惑。你不是刚刚在邮件中问过这个吗……哦……没有人回复。叹息。
  • 是的,约翰,非常感谢您的回答。
  • @John:这表明,邮件列表也需要一个代表系统。 :-P
  • 遗憾的是,邮件列表上的答案——在这种情况下,马修几个小时前回答了——可能要权威得多。就像在这种情况下一样。

标签: scheme racket


【解决方案1】:

从历史上看,Scheme(不是 Racket)一直允许重新定义。顶层的重新定义等同于现有绑定的突变。 Racket 对此进行了一些调整,因为不允许在 模块 的顶层代码重新定义标识符。但是,旧行为仍然存在于用于“eval”和交互窗口的“顶级”中。

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

【讨论】:

    【解决方案2】:

    Matthew Flatt 在邮件列表中对此答案进行了解释: http://www.mail-archive.com/users@racket-lang.org/msg09340.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-18
      • 2016-04-13
      • 2017-07-18
      • 2015-10-11
      • 2016-01-24
      • 1970-01-01
      相关资源
      最近更新 更多