Chr*_*ris 5 macros scheme r7rs
在Freenode的#scheme频道上提出了一个很好的问题.请考虑以下Scheme中的代码:
(define alpha 1)
(define-syntax foo
(syntax-rules (quote alpha)
((_ alpha msg) (define bar 2))
((_ other msg) (syntax-error msg)) ) )
(define (beta)
(foo alpha "beta")
(define alpha 3)
'beta )
(define (gamma)
(define alpha 4)
(foo alpha "gamma")
'gamma )
(define (delta alpha)
(foo alpha "delta")
'delta )
Run Code Online (Sandbox Code Playgroud)
的哪些beta,gamma以及delta应产生语法错误?并做?我已经用Chibi Scheme检查了这个问题,一切beta都很好gamma而且delta失败了.我想知道这是预期的行为还是仅仅是赤壁的一个错误.
根据标准,似乎扩展宏应该在内部定义被重写之前发生letrec*.所以,beta并且gamma都应该失败,因为foo它将与内部定义匹配alpha,而不是全局定义.
但是,标准中没有明确规定内部定义实际上是如何工作的,只是它们可以被认为是一个letrec快捷方式.我对Racket的R5RS有同样的行为,所以我似乎缺少标准中需要这种行为的东西.
好吧,我终于明白你的问题了。运行代码具有挑战性,因为您似乎有一个“语法错误”函数,仅当它出现在完全扩展的代码中时才会发出语法错误信号。任何。
我认为你的问题的答案是这样的:
这些计划人员(Dybvig、Felleisen、Hieb、Clinger、Rees、Wand、Flatt、Culpepper 等)非常聪明!
特别是,Scheme/Racket 以某种方式设法弄清楚绑定结构如何工作,即使它不知道什么是绑定或不是绑定。你说得对!太疯狂了!但 Dybvig 等人概述的算法。做了一些非常聪明的事情来确保卫生跟踪标识符是“自由标识符相等”还是“绑定标识符相等”(Flatt 的术语),即使它还不知道哪个标识符绑定另一个标识符。我个人建议阅读“协同工作的宏”(Flatt、Culpepper、Darais、Findler),以便更好地理解这一点。
如果我误解了你的问题,或者我的语气不恰当,请道歉!