マクロ展開時のライブラリ

R6RSでは、マクロの展開(expand)時と実行(run)時で実行環境が分離されている。
で、今までマクロの展開時のライブラリ定義を殆ど書いた記憶がないのにいろいろなscheme語彙を使えるのは何故なのかが素朴な疑問だった。
R6RSを見ると、

For the libraries defined in the library report, the export level is 0 for nearly all bindings. The exceptions are syntax-rules, identifier-syntax, ..., and _ from the (rnrs base (6)) library, which are exported with level 1, set! from the (rnrs base (6)) library, which is exported with levels 0 and 1, and all bindings from the composite (rnrs (6)) library (see library chapter on “Composite library”), which are exported with levels 0 and 1.

ということなので、平たく言えば(rnrs)はマクロ展開時にも使える。

ローコストなマクロ展開器は作れるのか

そう考えると、ちょっとした変換でマクロ展開器が作れるような気がする。つまり、(マクロの環境にシンボルをエクスポートするライブラリが無いと仮定すると、)"(import (rnrs))環境下で実行するとexpandされた式を出力するプログラム"にプログラムを変換することはそれほど難しくないように思える。
変換の内容として直ぐ思いつくのは、define-syntaxをdefineに、通常のdefineは以下のようにquasiquoteに変換されると考える(さらに識別子がboundだということを保存する必要が有る。)。

(define (f x) body)  `(define f (lambda (x) ,(EXPAND body))

地味に面倒なのは、syntax-caseに相当するS式操作関数が存在しないことで、moshのmatch-lambdaはよく似てるけどdrop-in-replacementではない。syntax-caseをそのまま使うことを考える。
普通にdefineした式でsyntax-caseが使えるのかが問題になる。

(define (f x) (syntax-case (x) ()
                ((_ a b) (list #'a #'b))))

こういう関数を書くことは出来るが、意味のある形で呼び出す方法は無いように思える。