<cl> (atom "abc") T <cl> (atom (make-array '(2 3))) T <cl> (atom #\a) T <cl> (defstruct test a b) TEST <cl> (atom (make-test :a 1 :b 2)) T <cl> (atom 'abc) T <cl> (atom 10) T <cl> (atom 1.1) T <cl> (atom '(a)) NIL <cl> (atom nil) T <cl> (atom '()) T注意しなければならないのは,nilもアトムということです. Lispでは,nilはアトムでもあり長さ0のリストでもあります. コンスセルを数えるには,リストをたどってゆきアトムでない要素が きたらば,それはコンスであるからそのコンスのcar部とcdr部の セルを数えた数に1を加えるということで再帰的に定義可能です.
(defun cell-count (tree) (cond ((atom tree) 0) (t (+ 1 (cell-count (car tree)) (cell-count (cdr tree))))))簡単な構造のリストに適用すると,
<cl> (cell-count '(a b c)) 3 <cl> (cell-count nil) 0 <cl> (cell-count '(a)) 1 <cl> (cell-count '((a))) 2となります.グラフと探索木に対して適用してみます.
<cl> (cell-count (graph-tree *graph1* 's)) 45 <cl> (cell-count (find-all-paths *graph1* 's)) 60 <cl> (cell-count *graph1*) 26 <cl> (cell-count *graph2*) 31となって,パスのリストで表現する*tree1*の方が*tree2*よりも冗長な分 よけいにセルが必要であることがわかります.