2009/11/22

Lisp備忘録 リストを利用したその他の形式

ツリー構造
リストの各コンスセルの中にリストを押し込んでいけばいい

CL-USER> (list (list 1 2) (list 3 4) (list 5 6))
((1 2) (3 4) (5 6))

ツリーを丸ごとコピーするにはcopy-tree.
copy-listでは内部の(1 2)などのセルはコピーせずに参照になる.

集合
adjoinを使って作成できる.
adjoinは非破壊的関数なので,直接元の値を変更する場合はpushnewを使う.

CL-USER> (defvar *x* nil)
NIL
CL-USER> (setf *x* (adjoin 1 *x*))
(1)
CL-USER> (adjoin 1 *x*)
(1)
CL-USER> (pushnew 2 *x*)
(2 1)
CL-USER> *x*
(2 1)


集合操作関数
リストを一つだけとる関数
member - 集合にあるアイテムが含まれているかどうか.

リストを2つ引数に取る関数
intersection - 両方の集合に含まれている要素のリストを返す.
union - 2つのリストに含まれているユニークな値のリストを返す
set-differece - 最初のリストに含まれていて二つ目のリストには存在しないもののリストを返す.
set-exclusive-or - 両方のリストのどちらか一方にだけ存在している要素のリストを返す.
上記4つの関数は頭にNの付く破壊型関数がある.

連想リストと属性リスト
連想リストはassocを使用してアクセスできる.

CL-USER> (assoc 'a '((a 1) (b 2) (c 3)))
(A 1)


通常通りconsを使用して連想リストを作成できるがCommon Lispにはacons関数もある.
非破壊的関数なのでsetfやpushを利用して値を変更する.

CL-USER> (acons 'a 1 *x*)
((A . 1))


属性リストはキーと値が順にならんだリスト構造.
A,B,Cを1,2,3に対応させた属性リストは(A 1 B 2 C 3)といった構造になる.
getf関数でキーに対応した値を取り出せ,setfで値を変更できる.キーと値の両方を削除するにはremfを使用する.

destructuring-bind
マクロのパラメータリストを受け取る時と同様に任意のリストの構造を分配できる.

CL-USER> (destructuring-bind (x y z) (list 1 2 3)
(list :x x :y y :z z))
(:X 1 :Y 2 :Z 3)




0 件のコメント:

コメントを投稿