Next: Modifying Lists, Previous: Building Lists, Up: Lists [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))と等価です。Generalized Variablesを参照してください。
リストから1番目の要素を取り出すpopマクロについては、List Elementsを参照してください。
以下の2つの関数は、変数の値であるリストを変更します。
この関数は、elementがsymbolの値のメンバーでない場合は、symbolにelementをコンスすることにより、変数symbolをセットします。この関数は、リストが更新されているかに関わらず、結果のリストをreturnしますsymbolの値は、呼び出し前にすでにリストであることが望ましいです。elementがリストの既存メンバーか比較するために、add-to-listはcompare-fnを使用します。compare-fnがnilの場合は、equalを使用します。
elementが追加される場合は通常、symbolの前に追加されますが、オプションの引数appendが非nilの場合は、最後に追加されます。
引数symbolは、暗黙にクォートされません。setqとは異なり、add-to-listはsetのような通常の関数です。クォートしたい場合は自分で引数をクォートします。
以下は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)と等価な式です:
(or (member value var)
(setq var (cons value var)))
この関数は、古い値(リストでなければなりません)のorderで指定された位置に、elementを挿入することにより、変数symbolをセットします。elementがすでにこのリストのメンバーである場合、リスト内の要素の位置はorderにしたがって調整されます。メンバーかどうかは、eqを使用してテストされます。この関数は、更新されているかどうかに関わらず、結果のリストをreturnします。
orderは通常、数字(正数か浮動小数)で、リストの要素は、その数字の昇順で並べられます。
orderを省略またはnilにすることもできます。これにより、リストにelementがすでに存在する場合、elementの数字順序は変更されません。それ以外では、elementは数字順序をもちません。リストの数字順序をもたない要素は、リストの最後に配され、特別な順序はつきません。
orderに他の値を指定した場合、elementがすでに数字順序をもつときは数字順序が削除されます。それ以外は、nilと同じです。
引数symbolは、暗黙にクォートされません。add-to-ordered-listは、setqなどとは異なり、setのような通常の関数です。必要な場合は引数を自分でクォートしてください。
順序の情報は、symbolのlist-orderプロパティーのハッシュテーブルに保存されます。
以下に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)