マクロのマッチングを実装しよう - 1.スタート

背景

R5RSで定義されているマクロのマッチングを適当にC++で実装していたが、仕様に沿った実装にしたい。
マッチングとか適当にやると痛い目を見るので、落ち着いて困難を分割していこうと思う。

マクロ?

マクロが使われている一例。
and をマクロで定義。

(define-syntax and
  (syntax-rules ()
    ((and) #t)
    ((and test) test)
    ((and test1 test2 ...)
     (if test1 (and test2 ...) #f))))

マクロとは何か、なぜ存在するのか?使いどころはどこか?は、On Lispを参照。

処理系から見たマクロ

処理系から見たマクロで考えるべきポイントは

  • マクロ展開のタイミング
  • 引数の評価の話
  • レキシカルスコープを汚染しないこと
  • パターンマッチング

と4つくらいかな。

上3つは処理系を書いていると自然と実装の予想がつくのだが4つ目は難しい。
パターンマッチングのコードを書いたことがあるかどうか?に依存するのでないかと思う。
個人的にはパターンマッチングが鬼門。

進め方

C++ で直接書きはじめるとパターンマッチングに以外に考えなければいけないことに気をとられることになると前回反省した。

  • メモリ管理
  • C++のデータ構造と S式の対応

などなど。
なので Scheme でパターンマッチングのコードを書いて完全に完成させる。(もちろんテストも書くよ。)
その後 C++ に移植しようと思う。
パターンマッチングは On Lisp に簡単な Common Lispのコードの例が載っているのでそれを参考に Scheme で書きはじめる。

次:マクロのマッチングを実装しよう2>