マクロのマッチング関数を書く
単純なパターン
- and - () - (_ a b) - (and 3 4)
はマッチ OK のパターン。
導かれるのは以下2つ。
- マクロ名の一致
- Node数の一致
入れ子のマッチ
- when - () - (_ pred a b) - (when (= x 3) (display "x=3") (display "\n"))
- マクロ名の一致
- マクロが下の階層の Node を見なければ、マッチングも下を見ない。
ここまで実装してみよう。可変個数マッチはあとまわし。
あまり欲張らずに分割するのが基本です。
よし実装できた気がする。
可変個数マッチ
- - and - () - (_ a b ...) - (and "hige" "huga" "hoge" "hoge")
現在の階層の Node の末尾が ... のときにはそれ以降のマッチングは true という感じだろうか。
うし実装できた。テストを先に書いているから検証が楽だ。
予約語
- - my-if - (my-then my-else) - (_ a my-then b my-else c) - (my-if (= 3 3) my-then 4 my-else 5)
うーん。予約後の場合は完全一致じゃないとダメってことかな。
つまり以下の場合は unmatch であるべき。
- - my-if - (my-then my-else) - (_ a my-then b my-else c) - (my-if (= 3 3) "hoge" 4 my-else 5)
今は match と判定されているので unmatch パターンにテストを追加してから実装しよう。
できた。