Function SET-DIFFERENCE
, NSET-DIFFERENCE
set-difference
list-1 list-2 &key key test test-not => result-list
nset-difference
list-1 list-2 &key key test test-not => result-list
list-1 - 通常のリスト
list-2 - 通常のリスト
test - 2つの引数を取りgeneralized-booleanを返却する関数の指定子
test-not - 2つの引数を取りgeneralized-booleanを返却する関数の指定子
key - 1つの引数を取りgeneralized-booleanを返却する関数の指定子、 またはnil
result-list - リスト
set-difference
は、list-2には現れない、 list-1の要素のリストを返却します。
nset-difference
は、set-difference
の破壊的バージョンです。 list-1はおそらく破壊されます。
list-1のひとつの要素と、list-2のひとつの要素からなる、 全ての順序付けされたペアに対して、 :test
か:test-not
を使ってテストが満たされるかどうかを決定します。 :test
か:test-not
の関数の最初の要素はlist-1の要素であり、 :key
関数によって返却されたものです(もし:key
が指定されたなら)。 二番目の引数はlist-2の要素であり、 :key
関数によって返却されたものです(もし:key
が指定されたなら)。
もし:key
が与えられたなら、 その引数は、list-1かlist-2の要素です。 :key
関数は通常与えられた要素の部分を返却します。 もし:key
が与えられないか、あるいはnil
が指定されたとき、 list-1とlist-2の要素が使われます。
list-1の要素は、 list-2のどの要素にもマッチしないときのみ、 結果に現れます。
どんな方法で引数の順番を変えたとしても、 結果の要素の順番に反映できる保証はありません。 結果のリストは、適切であれば、 list-1かlist-2のどちらかとセルを共有するか、 あるいはeq
になる可能性があります。
setq lst1 (list "A" "b" "C" "d")
(list "a" "B" "C" "d")) => ("a" "B" "C" "d")
lst2 (set-difference lst1 lst2) => ("d" "C" "b" "A")
(set-difference lst1 lst2 :test 'equal) => ("b" "A")
(set-difference lst1 lst2 :test #'equalp) => NIL
(nset-difference lst1 lst2 :test #'string=) => ("A" "b")
(setq lst1 '(("a" . "b") ("c" . "d") ("e" . "f")))
(=> (("a" . "b") ("c" . "d") ("e" . "f"))
setq lst2 '(("c" . "a") ("e" . "b") ("d" . "a")))
(=> (("c" . "a") ("e" . "b") ("d" . "a"))
nset-difference lst1 lst2 :test #'string= :key #'cdr)
(=> (("c" . "d") ("e" . "f"))
=> (("a" . "b") ("c" . "d") ("e" . "f"))
lst1 => (("c" . "a") ("e" . "b") ("d" . "a"))
lst2 ;; 名前に"c"か"w"を含む全ての食べ物は削除される
set-difference '("strawberry" "chocolate" "banana"
("lemon" "pistachio" "rhubarb")
#\c #\w)
'(:test #'(lambda (s c) (find c s)))
=> ("banana" "rhubarb" "lemon") ;One possible ordering.
nset-difference
はlist-1を破壊するでしょう。
なし。
list-1とlist-2が通常のリストではないとき、 型type-error
のエラーを通知する準備をしなければなりません。
3.2.1. コンパイラーの用語, 3.6. 横断の規則と副作用
:test-not
パラメーターは非推奨です。