Freenode的#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)
哪个beta
,gamma
和delta
应该产生语法错误的吗?而哪个做?我已经用赤壁计划检查了这个,其中beta
很好,而gamma
和delta
失败。我想知道这是一个有意的行为还是仅仅是赤壁的一个bug。
根据该标准,在内部定义被重写为letrec*
之前,扩展宏似乎应该发生。因此beta
和gamma
都应该都失败,因为foo
将与内部定义的alpha
匹配,而不是全局匹配。
但是,没有明确的标准规定内部定义是如何工作的,只是他们可以被作为letrec快捷想到的。我使用Racket的R5RS获得了相同的行为,所以看起来我错过了标准中要求这种行为的东西。
在R6RS(基于psyntax的impl)中,调用过程时我得到相同的行为。 – leppie 2014-09-26 07:40:54