Function INTERSECTION, NINTERSECTION

UP


Function INTERSECTION, NINTERSECTION

Function INTERSECTION, NINTERSECTION

構文

intersection list-1 list-2 &key key test test-not => result-list
nintersection 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 - リスト

定義

intersectionnintersectionは、 list-1list-2の両方に含まれるすべての要素を含むリストを返却します。

nintersectionは、intersectionの破壊的バージョンです。 それは同じ操作を行いますが、list-1はそのセルを使って結果を構築するときに、 破壊するかもしれません。 list-2は破壊されません。

intersectionの操作は、次のように定義されます。 list-1のひとつの要素と、list-2のひとつの要素からなる、 全ての順序付けされたペアに対して、 :test:test-notを使ってテストが満たされるかどうかを決定します。 :test:test-notの関数の最初の要素はlist-1の要素であり、 二番目の引数はlist-2の要素です。 もし:test:test-notが指定されなかったときは、 eqlを使用します。 もし同じ関数呼び出し内において、 :test:test-notの両方が指定された場合はエラーです。

もし:keynilではない値で与えられたときは、 リストの要素をテストする部分を引き出すときに使われます。 :key関数の引数は、list-1list-2の要素であり、 :key関数は通常与えられた要素の部分を返却します。 もし:keyが与えられないか、あるいはnilが指定されたとき、 list-1list-2の要素が使われます。

テストが満たされたすべてのペアは、 そのペアの2つの要素のうち正確にひとつが結果に格納されます。 どちらかのリストのある要素と、 他方のリストとのテストが満たされなかったときは、 その要素は結果のリストに現れません。 もしリストのいずれかに重複する要素がある場合、 結果には重複が生じるかもしれません。

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

例文

(setq list1 (list 1 1 2 3 4 a b c "A" "B" "C" "d")
      list2 (list 1 4 5 b c d "a" "B" "c" "D")) 
 =>  (1 4 5 B C D "a" "B" "c" "D")
(intersection list1 list2) =>  (C B 4 1 1)
(intersection list1 list2 :test 'equal) =>  ("B" C B 4 1 1)
(intersection list1 list2 :test #'equalp) =>  ("d" "C" "B" "A" C B 4 1 1) 
(nintersection list1 list2) =>  (1 1 4 B C)
list1 =>  implementation-dependent ;e.g.,  (1 1 4 B C)
list2 =>  implementation-dependent ;e.g.,  (1 4 5 B C D "a" "B" "c" "D")
(setq list1 (copy-list '((1 . 2) (2 . 3) (3 . 4) (4 . 5))))
=>  ((1 . 2) (2 . 3) (3 . 4) (4 . 5)) 
(setq list2 (copy-list '((1 . 3) (2 . 4) (3 . 6) (4 . 8))))
=>  ((1 . 3) (2 . 4) (3 . 6) (4 . 8)) 
(nintersection list1 list2 :key #'cdr) =>  ((2 . 3) (3 . 4)) 
list1 =>  implementation-dependent ;e.g.,  ((1 . 2) (2 . 3) (3 . 4)) 
list2 =>  implementation-dependent ;e.g.,  ((1 . 3) (2 . 4) (3 . 6) (4 . 8)) 

副作用

nintersectionlist-1を変更できますが、 list-2はそうではありません。

影響

なし。

例外

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

参考

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

備考

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

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


TOP, Github