Function ASSOC
, ASSOC-IF
, ASSOC-IF-NOT
assoc
item alist &key key test test-not => entry
assoc-if
predicate alist &key key => entry
assoc-if-not
predicate alist &key key => entry
item - オブジェクト
alist - 連想リスト
predicate - 1つの引数を取りgeneralized-booleanを返却する関数の指定子
test - 2つの引数を取りgeneralized-booleanを返却する関数の指定子
test-not - 2つの引数を取りgeneralized-booleanを返却する関数の指定子
key - 1つの引数を取る関数の指定子、またはnil
entry - alistの要素であるコンスか、nil
assoc
, assoc-if
, assoc-if-not
は、 alistにcar
がtestを満たすようなコンスがあれば返却し、 そのようなコンスが見つからないときはnil
を返却します。
assoc
, assoc-if
, assoc-if-not
は、 もしalistのペアが現れる場所にnil
あったとは無視します。
setq values '((x . 100) (y . 200) (z . 50))) => ((X . 100) (Y . 200) (Z . 50))
(assoc 'y values) => (Y . 200)
(rplacd (assoc 'y values) 201) => (Y . 201)
(assoc 'y values) => (Y . 201)
(setq alist '((1 . "one")(2 . "two")(3 . "three")))
(=> ((1 . "one") (2 . "two") (3 . "three"))
assoc 2 alist) => (2 . "two")
(assoc-if #'evenp alist) => (2 . "two")
(assoc-if-not #'(lambda(x) (< x 3)) alist) => (3 . "three")
(setq alist '(("one" . 1)("two" . 2))) => (("one" . 1) ("two" . 2))
(assoc "one" alist) => NIL
(assoc "one" alist :test #'equalp) => ("one" . 1)
(assoc "two" alist :key #'(lambda(x) (char x 2))) => NIL
(assoc #\o alist :key #'(lambda(x) (char x 2))) => ("two" . 2)
(assoc 'r '((a . b) (c . d) (r . x) (s . y) (r . z))) => (R . X)
(assoc 'goo '((foo . bar) (zoo . goo))) => NIL
(assoc '2 '((1 a b c) (2 b c d) (-7 x y z))) => (2 B C D)
(setq alist '(("one" . 1) ("2" . 2) ("three" . 3)))
(=> (("one" . 1) ("2" . 2) ("three" . 3))
assoc-if-not #'alpha-char-p alist
(:key #'(lambda (x) (char x 0))) => ("2" . 2)
なし。
alistが連想リストではないときは、 型type-error
を通知する準備をしなければなりません。
rassoc
, find
, member
, position
, 3.6. 横断の規則と副作用
:test-not
は、非推奨です。
関数assoc-if-not
は、非推奨です。
alistを更新するために、 assoc
の結果がnil
でなければ、 rplacd
を使うことができます。
次の2つの式
assoc item list :test fn)
(find item list :test fn :key #'car) (
これらは、ひとつの例外を除いては同じ意味です。 例外は、もしalistのペアの場所でnil
現れて、 かつitemがnil
のとき、 find
の場合は、nil
のcar
を計算し、 itemと同じということでnil
を返却しますが、 一方assoc
は、 alistのnil
を無視するため、 継続してcar
がnil
である実際のコンスを探します。