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
た。これは意図した動作なのか、Chibi の単なるバグなのか疑問に思います。gamma
delta
標準によると、マクロの展開は、内部定義が に書き換えられる前に行われるべきであると思われletrec*
ます。したがってbeta
、グローバルなものではなく、内部的に定義された と一致するため、gamma
両方とも失敗するはずです。foo
alpha
ただし、内部定義が実際にどのように機能するかは標準では明示的に指定されておらず、letrec のショートカットとして考えられるだけです。Racket の R5RS で同じ動作が得られるため、そのような動作を要求する標準に何かが欠けているようです。