Scheme中的宏和内部定义

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有同样的行为,所以我似乎缺少标准中需要这种行为的东西.

Joh*_*nts 1

好吧,我终于明白你的问题了。运行代码具有挑战性,因为您似乎有一个“语法错误”函数,仅当它出现在完全扩展的代码中时才会发出语法错误信号。任何。

我认为你的问题的答案是这样的:

这些计划人员(Dybvig、Felleisen、Hieb、Clinger、Rees、Wand、Flatt、Culpepper 等)非常聪明!

特别是,Scheme/Racket 以某种方式设法弄清楚绑定结构如何工作,即使它不知道什么是绑定或不是绑定。你说得对!太疯狂了!但 Dybvig 等人概述的算法。做了一些非常聪明的事情来确保卫生跟踪标识符是“自由标识符相等”还是“绑定标识符相等”(Flatt 的术语),即使它还不知道哪个标识符绑定另一个标识符。我个人建议阅读“协同工作的宏”(Flatt、Culpepper、Darais、Findler),以便更好地理解这一点。

如果我误解了你的问题,或者我的语气不恰当,请道歉!