Function SET-EXCLUSIVE-OR
, NSET-EXCLUSIVE-OR
set-exclusive-or
list-1 list-2 &key key test test-not => result-list
nset-exclusive-or
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-1とlist-2に 正確に一度現れている要素をリストで返却します。
nset-exclusive-or
は、set-exclusive-or
の破壊的バージョンです。
list-1のひとつの要素と、list-2のひとつの要素からなる、 全ての順序付けされたペアに対して、 :test
か:test-not
を使ってテストが満たされるかどうかを決定します。
もし:key
が与えられたなら、 list-1かlist-2の要素をテストする部分を引き出すときに使われます。 :test
か:test-not
の関数の最初の要素はlist-1の要素であり、 :key
関数によって返却されたものです(もし:key
が指定されたなら)。 二番目の引数はlist-2の要素であり、 :key
関数によって返却されたものです(もし:key
が指定されたなら)。 もし:key
が与えられないか、あるいはnil
が指定されたとき、 list-1とlist-2の要素が使われます。
結果は、list-1とlist-2の要素のうち、 マッチするペアがないものを正確に含んでいます。
set-difference
の結果のリストは、 list-1かlist-2のどちらかが ストレージ上で共有されているかもしれません。
setq lst1 (list 1 "a" "b")
(list 1 "A" "b")) => (1 "A" "b")
lst2 (set-exclusive-or lst1 lst2) => ("b" "A" "b" "a")
(set-exclusive-or lst1 lst2 :test #'equal) => ("A" "a")
(set-exclusive-or lst1 lst2 :test 'equalp) => NIL
(nset-exclusive-or lst1 lst2) => ("a" "b" "A" "b")
(setq lst1 (list (("a" . "b") ("c" . "d") ("e" . "f"))))
(=> (("a" . "b") ("c" . "d") ("e" . "f"))
setq lst2 (list (("c" . "a") ("e" . "b") ("d" . "a"))))
(=> (("c" . "a") ("e" . "b") ("d" . "a"))
nset-exclusive-or lst1 lst2 :test #'string= :key #'cdr)
(=> (("c" . "d") ("e" . "f") ("c" . "a") ("d" . "a"))
=> (("a" . "b") ("c" . "d") ("e" . "f"))
lst1 => (("c" . "a") ("d" . "a")) lst2
nset-exclusive-or
は、list-1かlist-2のリスト構造のcar
, cdr
の どの部分も修正することが許されています。
なし。
list-1とlist-2が通常のリストではないとき、 型type-error
のエラーを通知する準備をしなければなりません。
3.2.1. コンパイラーの用語
:test-not
パラメーターは非推奨です。
nset-exclusive-or
の副作用は必要ないため、 移植可能なコードにおいては副作用のみを期待した姿勢で使うべきではありません。