5.3 Segmentパターンマッチ
この節ではパターンマッチに複数の単語にマッチさせる変数を導入しました。
Segmentパターンは"(?* var)"の形で表し、以下のように使います。
((?* ?x) is (?* ?y))
このパターンを '(this is a pen)とマッチさせると、
((?x . this) (?y a pen))
とマッチします。
Segmentマッチのさせ方の基本は、パターンがSegmentマッチ変数だった場合に
- 「パターンの次の要素」に一致する入力要素を探す
- 一致する入力要素がある場合、現在の入力要素から一致する入力要素の前までを変数の値とする
とします。
選択したSegmentマッチの結果で矛盾が起きたり、残りのパターンがマッチしなかった場合、Segmentを伸ばしてマッチを繰り返します。
CL-USER> (pat-match '((?* ?x) is a (?* ?y)) (what he is is a fool))
での動きを確認すると、
- ?xに(what he)が束縛されますが、その後の(is a (?* ?y))が(is is a fool)にマッチしません。
- ?xに(what he is)が束縛されると、(is a (?* ?y))に(is a fool)がマッチします
となります。