【发布时间】:2014-11-18 07:37:53
【问题描述】:
在 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 上得到了相同的行为,所以我似乎在标准中遗漏了一些需要这种行为的东西。
【问题讨论】:
-
在 R6RS(基于 psyntax 的 impl)中,我在调用过程时得到了相同的行为。