Next: 1.3 変数の定義
Up: 1 変数を含むパターンとデータのマッチング
Previous: 1.1 マッチング関数の仕様
パターン中の変数がデータと照合するかどうかを調べるマッチング関数の構造
は,tree-equalと同様に考えることができる.
(defun tree-equal (a b)
(cond
((or (atom a) (atom b)) (eql a b))
(t (and (tree-equal (first a) (first b))
(tree-equal (rest a) (rest b))))))
tree-equalと違って,比較するパターンが変数であればそれと対応関係を調べ
られるデータがなんであろうとマッチする.変数ではなく,どちらかがアトムな
らばeqlで等しいことをチェックし,そうでなければ再帰的に各要素に対して
マッチング処理を繰り返す.
(defun match (a b)
(cond
((variable-p a) t) ;;; ここがちがう
((or (atom a) (atom b)) (eql a b))
(t (and (match (first a) (first b))
(match (rest a) (rest b))))))
これだけでは,前に述べたように,同じ変数が複数箇所で現れるパター
ンの場合には,同じデータにマッチングしているかどうかを判定させることが
できない.
そこで,マッチング処理の中でバインディング情報を参照して
判定する処理が必要となる.
(defun match (a b &optional bindings)
(cond
((variable-p a)
(match-variable a b bindings))
((or (atom a) (atom b))
(match-atom a b bindings))
(t (match-list a b bindings))))
match-variable, match-atom, match-listというようにデータの型ごとに
副手続きを用意することで実現できそうである.
generated through LaTeX2HTML. M.Inaba 平成18年5月7日