next up previous
Next: 1.3 変数の定義 Up: 1 変数を含むパターンとデータのマッチング Previous: 1.1 マッチング関数の仕様

1.2 マッチング関数の構造

パターン中の変数がデータと照合するかどうかを調べるマッチング関数の構造 は,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日