見えないものを見ようとして

以前に Scheme (R6RS) で識別子が定義済みか否かを判定するマクロを書いた。

不意に、メタレベルを指定した識別子をこのマクロに与えた場合にどう判定されるかということが気になったのでこんなコードで試してみた。

#!r6rs
(import (except (rnrs) sin)
        (for (only (rnrs) sin) expand)
        (bound))

(display (if-bound sin (sin 1) "not found sin."))

implicit phasing を採用している処理系やフェイズの分離が有耶無耶な処理系では意味がないので、そうではない Larceny と NMosh で試してみたのだが、いずれもエラーとなる。 if-bound マクロによって sin は存在すると判定されてしまうのだ。 もちろんフェイズ 0 で sin を使えないのでエラーとなってしまう。

仕様を眺めてみても、こういう挙動になる理屈がよくわからない。

Document ID: 4293b446c53a7cb372fd564ed15c2e66