next up previous
Next: 8.4 文字 Up: 8 CommonLispのデータとその比較手続き Previous: 8.2 シンボル


8.3 リスト

リストが同じかどうかには,2種類のものがあります. それらは,(1)リストの構造と中身が同じでコピーされたもの, と,(2)コピーではなくポインタが同じもの. です.前者はeqで,後者はtree-equalで判定します. eqなリストはtree-equalですが,tree-equalなリストは必ずしも eqになるとは限りません. Lisp処理系は通常リストデータを読み込むとそれまでに作られた リストを調べることはせずに,必ず新しいリストデータ構造を 作ります.そのため
<cl> (eq '(a b c) '(a b c))
NIL 
<cl> (equal '(a b c) '(a b c))
T 
<cl> (setq a '(a b) b '(a b))
(A B) 
<cl> a
(A B) 
<cl> b
(A B) 
<cl> (eq a b)
NIL 
<cl> (tree-equal a b)
T
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))))))
というように再帰的に定義できます. リストを返す通常の関数は,コンスをひとつ以上作って引数データをそのコン スから継れた形で作ります.

generated through LaTeX2HTML. M.Inaba 平成18年5月7日