Function SET-EXCLUSIVE-OR, NSET-EXCLUSIVE-OR

UP


Function SET-EXCLUSIVE-OR, NSET-EXCLUSIVE-OR

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-1list-2に 正確に一度現れている要素をリストで返却します。

nset-exclusive-orは、set-exclusive-orの破壊的バージョンです。

list-1のひとつの要素と、list-2のひとつの要素からなる、 全ての順序付けされたペアに対して、 :test:test-notを使ってテストが満たされるかどうかを決定します。

もし:keyが与えられたなら、 list-1list-2の要素をテストする部分を引き出すときに使われます。 :test:test-notの関数の最初の要素はlist-1の要素であり、 :key関数によって返却されたものです(もし:keyが指定されたなら)。 二番目の引数はlist-2の要素であり、 :key関数によって返却されたものです(もし:keyが指定されたなら)。 もし:keyが与えられないか、あるいはnilが指定されたとき、 list-1list-2の要素が使われます。

結果は、list-1list-2の要素のうち、 マッチするペアがないものを正確に含んでいます。

set-differenceの結果のリストは、 list-1list-2のどちらかが ストレージ上で共有されているかもしれません。

例文

(setq lst1 (list 1 "a" "b")
      lst2 (list 1 "A" "b")) =>  (1 "A" "b")
(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")) 
lst1 =>  (("a" . "b") ("c" . "d") ("e" . "f"))
lst2 =>  (("c" . "a") ("d" . "a")) 

副作用

nset-exclusive-orは、list-1list-2のリスト構造のcar, cdrの どの部分も修正することが許されています。

影響

なし。

例外

list-1list-2が通常のリストではないとき、 型type-errorのエラーを通知する準備をしなければなりません。

参考

3.2.1. コンパイラーの用語

備考

:test-notパラメーターは非推奨です。

nset-exclusive-orの副作用は必要ないため、 移植可能なコードにおいては副作用のみを期待した姿勢で使うべきではありません。


TOP, Github