Schemeの衛生マクロ機構
健全なマクロ、ハイジニックマクロ、Hygienic Macroともいう
伝統的なLISPのマクロ機構ではS式をS式に変換する
この方法は割とスケールするが問題を抱えている
マクロが挿入するシンボルとユーザーが挿入するシンボルが被る
一時変数を使わないといけない構文を作成する時、それっぽいシンボル(varとかtmpとか)を挿入するけど、これをユーザーが使うと破滅する
何を書くかは分からないからね
これはgensymを使うと解決する
gensymがつらいという問題を除けば十分
ユーザーがマクロが使う構文要素や変数を書き換えてしまうと機能しなくなる
こちらはどうにもならないので気を付けるしかない
名前空間を分ければいいのではという発想が生まれた
でもS式ではできない、どうするの
式の変換時に変換器のコンテキストやコンパイラの内部情報を括り付けるといい
これが衛生的マクロ
S式は全て表に出るので表示できるが、内部コンテキストはS式じゃないので出ない
これが難しいと感じる原因の一つだと思う
僕が普段使ってるGaucheには低レイヤーの衛生マクロ機構として明示的リネーミングマクロが存在する
上に書いた内部情報を括り付けるための手続き及び変換を加味したシンボルの比較用述語が渡ってくる以外は伝統的マクロと何も変わらない
define-macroとか普通に実装できる
chibi-schemeの内部を見た限りだとこれがあれば完全にsyntax-rulesを実装できそう
遊びで作ってた処理系にも積んだことはあるので、こちらは完全に理解してるつもり
Chibi-Schemeで使われている実装が参照実装として存在する
(er-macro-transformer length* syntax-quote)を追加で要求するらしい
https://srfi.schemers.org/srfi-149/srfi-149.html
実装してみた記事があってとても参考になる
KFFD
syntactic closures
https://tociyuki.hatenablog.jp/entry/20180118/1516250969
https://tociyuki.hatenablog.jp/entry/20180119/1516331785
https://tociyuki.hatenablog.jp/entry/20180120/1516416688
Clinger-Rees explicit renaming
https://tociyuki.hatenablog.jp/entry/20180123/1516709282
https://tociyuki.hatenablog.jp/entry/20180124/1516794682
reversed syntactic closures
https://tociyuki.hatenablog.jp/entry/20180127/1517028500
https://tociyuki.hatenablog.jp/entry/20180128/1517097667
https://tociyuki.hatenablog.jp/entry/20180129/1517218907
dotted-listの展開
構文オブジェクト
https://tociyuki.hatenablog.jp/entry/20180204/1517752423
https://tociyuki.hatenablog.jp/entry/20180216/1518738607
https://tociyuki.hatenablog.jp/entry/20180219/1519046712
https://tociyuki.hatenablog.jp/entry/20180305/1520246408
https://tociyuki.hatenablog.jp/entry/20180311/1520777862
https://tociyuki.hatenablog.jp/entry/20180312/1520856337
https://tociyuki.hatenablog.jp/entry/20180313/1520894846
https://tociyuki.hatenablog.jp/entry/20180314/1521029552
https://tociyuki.hatenablog.jp/entry/20180315/1521111896
https://tociyuki.hatenablog.jp/entry/20180316/1521205165
https://tociyuki.hatenablog.jp/entry/20180318/1521343394
Chibi-Scheme
length*
syntax-quote
syntax-rules
https://tociyuki.hatenablog.jp/entry/20180223/1519395239
https://tociyuki.hatenablog.jp/entry/20180227/1519734858
https://tociyuki.hatenablog.jp/entry/20180228/1519810258
https://tociyuki.hatenablog.jp/entry/20180322/1521722354
https://tociyuki.hatenablog.jp/entry/20180324/1521850951
変換世代マーク・リスト