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
了。我想知道这是有意的行为还是只是 Chibi 中的错误。
根据标准,似乎应该在内部定义被重写之前扩展宏letrec*
。因此beta
,gamma
两者都应该失败,因为foo
将匹配内部定义alpha
的,而不是全局的。
但是,标准中没有明确规定内部定义的实际工作方式,只是可以将它们视为 letrec 快捷方式。我在 Racket 的 R5RS 上得到了相同的行为,所以我似乎在标准中遗漏了一些需要这种行为的东西。