在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 )
的哪些beta
,gamma
以及delta
应产生语法错误?并做?我已经用Chibi Scheme检查了这个问题,一切beta
都很好gamma
而且delta
失败了.我想知道这是预期的行为还是仅仅是赤壁的一个错误.
根据标准,似乎扩展宏应该在内部定义被重写之前发生letrec*
.所以,beta
并且gamma
都应该失败,因为foo
它将与内部定义匹配alpha
,而不是全局定义.
但是,标准中没有明确规定内部定义实际上是如何工作的,只是它们可以被认为是一个letrec快捷方式.我对Racket的R5RS有同样的行为,所以我似乎缺少标准中需要这种行为的东西.