(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というようにデータの型ごとに 副手続きを用意することで実現できそうである.