マクロのマッチングを実装しよう - 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つ目は難しい。
パターンマッチングのコードを書いたことがあるかどうか?に依存するのでないかと思う。
個人的にはパターンマッチングが鬼門。