Next: , Previous: , Up: Lists   [Contents][Index]


5.5 Modifying List Variables

これらの関数、および1つのマクロは、変数に格納されたリストを変更する便利な方法を提供します。

Macro: push element listname

このマクロは、CARelementで、CDRlistnameで指定されたリストであるような新しいリストを作成して、そのリストを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つの関数は、変数の値であるリストを変更します。

Function: add-to-list symbol element &optional append compare-fn

この関数は、elementsymbolの値のメンバーでない場合は、symbolelementをコンスすることにより、変数symbolをセットします。この関数は、リストが更新されているかに関わらず、結果のリストをreturnしますsymbolの値は、呼び出し前にすでにリストであることが望ましいです。elementがリストの既存メンバーか比較するために、add-to-listcompare-fnを使用します。compare-fnnilの場合は、equalを使用します。

elementが追加される場合は通常、symbolの前に追加されますが、オプションの引数appendが非nilの場合は、最後に追加されます。

引数symbolは、暗黙にクォートされません。setqとは異なり、add-to-listsetのような通常の関数です。クォートしたい場合は自分で引数をクォートします。

以下は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)))
Function: add-to-ordered-list symbol element &optional order

この関数は、古い値(リストでなければなりません)のorderで指定された位置に、elementを挿入することにより、変数symbolをセットします。elementがすでにこのリストのメンバーである場合、リスト内の要素の位置はorderにしたがって調整されます。メンバーかどうかは、eqを使用してテストされます。この関数は、更新されているかどうかに関わらず、結果のリストをreturnします。

orderは通常、数字(正数か浮動小数)で、リストの要素は、その数字の昇順で並べられます。

orderを省略またはnilにすることもできます。これにより、リストにelementがすでに存在する場合、elementの数字順序は変更されません。それ以外では、elementは数字順序をもちません。リストの数字順序をもたない要素は、リストの最後に配され、特別な順序はつきません。

orderに他の値を指定した場合、elementがすでに数字順序をもつときは数字順序が削除されます。それ以外は、nilと同じです。

引数symbolは、暗黙にクォートされません。add-to-ordered-listは、setqなどとは異なり、setのような通常の関数です。必要な場合は引数を自分でクォートしてください。

順序の情報は、symbollist-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)