Next: Association Lists, Previous: Modifying Lists, Up: Lists
リストで、数学の順序のない集合を表現できます。
つまり、リストに現れる要素を集合の要素と考え、
リスト内での順序は無視します。
2つの集合の和集合を作るには、
(要素が重複することを気にしなければ)append
を使います。
集合向けの他の有用な関数には、memq
やdelq
、および、
これらのequal
版であるmember
やdelete
があります。
Common Lispに関した注意: Common Lispには、集合演算向けに (要素の重複を避ける)関数union
とintersection
があるが、 GNU Emacs Lispにはない。 必要ならば、読者みずからLispでこれらを書ける。
この関数は、objectがlistの要素かどうか調べる。 そうならば、
memq
はobjectが最初に現れるところから始まるリストを返す。 さもなければnil
を返す。memq
の文字‘q’は、リストの要素に対するobjectの比較にeq
を使うことを意味する。 たとえば、(memq 'b '(a b c b a)) (b c b a) (memq '(2) '((1) (2))) ;(2)
と(2)
はeq
ではない nil
この関数は、listからobjectに
eq
であるすべての要素を 破壊的に削除する。delq
の文字‘q’は、memq
と同様に、 リストの要素に対するobjectの比較にeq
を使うことを意味する。
delq
がリストの先頭から要素を削除する場合には、
単にリストを辿って削除した要素のつぎから始まる部分リストを返します。
(delq 'a '(a b c)) == (cdr '(a b c))
リストの中ほどの要素を削除する場合には、 削除にはcdrの変更を伴います(see Setcdr)。
(setq sample-list '(a b c (4))) (a b c (4)) (delq 'a sample-list) (b c (4)) sample-list (a b c (4)) (delq 'c sample-list) (a b (4)) sample-list (a b (4))
(delq 'c sample-list)
は、
3番目の要素を切り取ってsample-list
を変更しますが、
(delq 'a sample-list)
では、
なにも切り取らずに単に短いリストを返すことに注意してください。
引数listを保持していた変数が、実行後には少ない要素を持つと仮定したり、
もとのリストを保持し続けていると仮定したりしないでください!
そのかわりに、delq
の結果を保存して、それを使ってください。
多くの場合、つぎのように、
もとのリストを保持していた変数に結果を保存し直します。
(setq flowers (delq 'rose flowers))
つぎの例では、delq
が一致を取ろうとしている(4)
と
sample-list
の(4)
とはeq
ではありません。
(delq '(4) sample-list) (a c (4))
つぎの2つの関数は、memq
やdelq
に似ていますが、
比較にはeq
のかわりにequal
を使います。
See Equality Predicates。
関数
member
は、equal
を使ってobjectと要素を比較して、 objectがlistの要素かどうか調べる。 objectが要素であれば、member
はlist内でそれが最初に現れるところから始まるリストを返す。 さもなければnil
を返す。
memq
と比較してほしい。(member '(2) '((1) (2))) ;(2)
と(2)
はequal
である ((2)) (memq '(2) '((1) (2))) ;(2)
と(2)
はeq
ではない nil ;; 同じ内容の2つの文字列はequal
である (member "foo" '("foo" "bar")) ("foo" "bar")
この関数は、listからobjectに
equal
であるすべての要素を 破壊的に削除する。member
がmemeq
に対応するように、delq
に対応する。member
と同様に、 要素とobjectとの比較にはequal
を使う。 一致する要素をみつけると、delq
と同様に要素を削除する。 たとえば、つぎのとおり。(delete '(2) '((2) (1) (2))) ((1))
Common Lispに関した注意: GNU Emacs Lispの関数member
と関数delete
は Maclispから受け継いだものであり、Common Lispからではない。 Common Lisp版では要素の比較にはequal
を使わない。
変数に格納したリストに要素を追加する別の方法については、
Setting Variablesの関数add-to-list
を参照してください。