<cl> (make-array '(3 3)) #2a((NIL NIL NIL) (NIL NIL NIL) (NIL NIL NIL)) <cl> (make-array '(3 3) :initial-contents '((t nil nil) (t t t) (t nil t))) #2a((T NIL NIL) (T T T) (T NIL T))配列を用いてグラフを表現する場合に,配列のインデックスと 頂点との対応を付けるための工夫が必要です. ここでは,頂点のリストにおけるインデックスに合わせた 配置になるようにpositionという関数を 用いて自動的に頂点の名前からインデックスを求めることを行なっています.
(defun adjacency-matrix (&optional (gvl *graph-vertex-list*) (gel *graph-edge-list*)) (let ((graph (make-array (list (length gvl) (length gvl))))) (dolist (el gel) (setf (aref graph (position (car el) gvl) (position (cadr el) gvl)) t) (setf (aref graph (position (cadr el) gvl) (position (car el) gvl)) t)) graph))
<cl> (setq *graph5* (adjacency-matrix *graph-vertex-list* *graph-edge-list*)) #2a((NIL T T NIL NIL NIL NIL) (T NIL T T NIL NIL NIL) (T T NIL NIL NIL T NIL) (NIL T NIL NIL T T NIL) (NIL NIL NIL T NIL NIL NIL) (NIL NIL T T NIL NIL T ) (NIL NIL NIL NIL NIL T NIL))ここで用いているpositionはシーケンスデータに対して第一引数で渡したデー タと同じ要素のある場所を返す関数です.:test, :key引数も使えます.
<cl> (position 'a '(a b c)) 0 <cl> (position 'c '(a b c)) 2 <cl> (position 'x '(a b c)) NIL <cl> (position '(b) '((a) (b) (c))) NIL