パターン変数のリネーム

先日、ツイッタで色々と書いたりしたのだが、まとめてなかったので記事にしておく。

Scheme の syntax-rules に於いてパターン変数は変数なのかどうか、マクロでマクロを生成しようとしたときにパターン変数はリネームされるのかどうかということを疑問に思って試しにこんなものを書いてみた。

(import (scheme base)
        (scheme write))

(define-syntax foo
  (syntax-rules ()
    ((_ x)
     (let-syntax ((bar (syntax-rules (x)
                         ((_ a) #t)
                         ((_ b) #f))))
       (bar b)))))

(display (foo a))

ここでパターン変数 a はリネームされることで外から与えられる a とは別物となり、結果的に #t が表示されるのが Scheme 的には自然な振舞いであると私は考えた。 実際に多くの処理系はそうなるし、その挙動が自然だと思うという意見も寄せられた。

しかし、少数ながら上記のコードで #f を表示するものもある。 また、パターン変数をリネームしなければならないとする記述を仕様の中に見付けることが出来ない。 書いていない以上はリネームしないと解釈すべきなのか、それとも未規定と考えるべきかなのだが…。

常識的に考えればリネームすべきだし、単なる記載漏れだろうと思う。 それともどこかに書いてあって、私が読み取れていないのだろうか。

Document ID: e0526d8d741e4b9c2e46b9ab2787ce1f