在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,而不是全局定义.
但是,标准中没有明确规定内部定义实际上是如何工作的,只是它们 …