Function SET-DIFFERENCE, NSET-DIFFERENCE

UP


Function SET-DIFFERENCE, NSET-DIFFERENCE

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-1list-2の要素です。 :key関数は通常与えられた要素の部分を返却します。 もし:keyが与えられないか、あるいはnilが指定されたとき、 list-1list-2の要素が使われます。

list-1の要素は、 list-2のどの要素にもマッチしないときのみ、 結果に現れます。

どんな方法で引数の順番を変えたとしても、 結果の要素の順番に反映できる保証はありません。 結果のリストは、適切であれば、 list-1list-2のどちらかとセルを共有するか、 あるいはeqになる可能性があります。

例文

(setq lst1 (list "A" "b" "C" "d")
      lst2 (list "a" "B" "C" "d")) =>  ("a" "B" "C" "d")
(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")) 
lst1 =>  (("a" . "b") ("c" . "d") ("e" . "f")) 
lst2 =>  (("c" . "a") ("e" . "b") ("d" . "a")) 
;; 名前に"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-differencelist-1を破壊するでしょう。

影響

なし。

例外

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

参考

3.2.1. コンパイラーの用語, 3.6. 横断の規則と副作用

備考

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


TOP, Github