Next: 既存のリスト構造の変更, Previous: コンスセルおよびリストの構築, Up: リスト [Contents][Index]
以下の関数と1つのマクロは、変数に格納されたリストを変更する便利な方法を提供します。
このマクロはCARがelementで、CDRがlistnameのリストであるような新しいリストを作成して、そのリストをlistnameに保存する。listnameがリストに名前をつけるクォートされていないシンボルのときは単純で、この場合マクロは(setq listname (cons element listname))と等価になる。
(setq l '(a b))
⇒ (a b)
(push 'c l)
⇒ (c a b)
l
⇒ (c a b)
より一般的なのはlistnameが汎変数の場合である。この場合、このマクロは(setf listname (cons element listname))と等価になる。ジェネリック変数を参照のこと。
リストから1番目の要素を取り出すpopマクロについては、リスト要素へのアクセスを参照されたい。
以下の2つの関数は、変数の値であるリストを変更します。
この関数はelementがsymbolの値のメンバーでなければ、symbolにelementをコンスすることにより、変数symbolをセットする。この関数はリストが更新されているか否かに関わらず、結果のリストをリターンする。symbolの値は呼び出し前にすでにリストであることが望ましい。elementがリストの既存メンバーか比較するために、add-to-listはcompare-fnを使用する。compare-fnがnilならequalを使用する。
elementが追加される場合は、通常はsymbolの前に追加されるが、オプションの引数appendが非nilなら最後に追加される。
引数symbolは暗黙にクォートされない。setqとは異なりadd-to-listはsetのような通常の関数である。クォートしたい場合には自分で引数をクォートすること。
symbolがレキシカル変数を参照する際にはこの関数を使用しないこと。
以下にadd-to-listを使用する方法をシナリオで示します:
(setq foo '(a b))
⇒ (a b)
(add-to-list 'foo 'c) ;; cを追加
⇒ (c a b)
(add-to-list 'foo 'b) ;; 効果なし
⇒ (c a b)
foo ;; fooが変更された
⇒ (c a b)
以下は(add-to-list 'var value)と等価な式です:
(if (member value var)
var
(setq var (cons value var)))
この関数は古い値のorder
(リストであること)で指定された位置に、elementを挿入して変数symbolをセットする。elementがすでにこのリストのメンバなら、リスト内の要素の位置はorderにしたがって調整される。メンバーか否かはeqを使用してテストされる。この関数は更新されているかどうかに関わらず、結果のリストをリターンする。
orderは通常は数字(整数か浮動小数点数)で、リストの要素はその数字の昇順で並べられる。
orderは省略またはnilを指定できる。これによりリストにelementがすでに存在するなら、elementの数字順序は変更されない。それ以外ならelementは数字順序をもたない。リストの数字順序をもたない要素はリストの最後に配置され、特別な順序はつかない。
orderに他の値を指定すると、elementがすでに数字順序をもつときは数字順序が削除される。それ以外はならnilと同じ。
引数symbolは暗黙にクォートされない。add-to-ordered-listはsetqなどとは異なり、setのような通常の関数である。必要なら引数を自分でクォートすること。
順序の情報はsymbolのlist-orderプロパティにハッシュテーブルで保存される。symbolはレキシカル変数を参照できない。
以下にadd-to-ordered-listを使用する方法をシナリオで示します:
(setq foo '())
⇒ nil
(add-to-ordered-list 'foo 'a 1) ;; aを追加
⇒ (a)
(add-to-ordered-list 'foo 'c 3) ;; cを追加
⇒ (a c)
(add-to-ordered-list 'foo 'b 2) ;; bを追加
⇒ (a b c)
(add-to-ordered-list 'foo 'b 4) ;; bを移動
⇒ (a c b)
(add-to-ordered-list 'foo 'd) ;; dを後に追加
⇒ (a c b d)
(add-to-ordered-list 'foo 'e) ;; eを追加
⇒ (a c b e d)
foo ;; fooが変更された
⇒ (a c b e d)