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)