伝統的マクロ
quasiquoteが動いたので、伝統的マクロを実装してみた。展開して評価できるところまで動いた。
evalExpのパターンマッチにMacroAppExp節を追加。
let rec evalExp env = function | MacroAppExp (id, sexps) -> let args = List.map evalQuote sexps and m = !(lookup id env) in let s = eval_apply m args in evalExp env (parseExp (val_to_sexp s))
マクロの中のマクロ呼び出しは、evalExpの中で再帰的に展開している。
マクロ展開は一回だけ実行するように変更するには、パーサと評価部や環境との依存関係にかなり影響がありそうである。