マクロのマッチング関数を書く

単純なパターン

- 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 パターンにテストを追加してから実装しよう。
できた。

リファクタリング

ちとコードの見通しが悪くなってきたのでリファクタリングしよう。

  • private にできるものは private
  • 重複はまとめる