Schemeの衛生マクロ機構
健全なマクロ、ハイジニックマクロ、Hygienic Macroともいう
この方法は割とスケールするが問題を抱えている
マクロが挿入するシンボルとユーザーが挿入するシンボルが被る
一時変数を使わないといけない構文を作成する時、それっぽいシンボル(varとかtmpとか)を挿入するけど、これをユーザーが使うと破滅する
何を書くかは分からないからね
gensymがつらいという問題を除けば十分
ユーザーがマクロが使う構文要素や変数を書き換えてしまうと機能しなくなる
こちらはどうにもならないので気を付けるしかない
名前空間を分ければいいのではという発想が生まれた
でもS式ではできない、どうするの
式の変換時に変換器のコンテキストやコンパイラの内部情報を括り付けるといい
これが衛生的マクロ
S式は全て表に出るので表示できるが、内部コンテキストはS式じゃないので出ない
これが難しいと感じる原因の一つだと思う
上に書いた内部情報を括り付けるための手続き及び変換を加味したシンボルの比較用述語が渡ってくる以外は伝統的マクロと何も変わらない 遊びで作ってた処理系にも積んだことはあるので、こちらは完全に理解してるつもり (er-macro-transformer length* syntax-quote)を追加で要求するらしい
実装してみた記事があってとても参考になる
syntactic closures
Clinger-Rees explicit renaming
reversed syntactic closures
構文オブジェクト