伝統的マクロ

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の中で再帰的に展開している。
マクロ展開は一回だけ実行するように変更するには、パーサと評価部や環境との依存関係にかなり影響がありそうである。