% Function REMOVE-DUPLICATES, DELETE-DUPLICATES
Function REMOVE-DUPLICATES
, DELETE-DUPLICATES
remove-duplicates
sequence
&key from-end test test-not start end key
=> result-sequence
delete-duplicates
sequence
&key from-end test test-not start end key
=> result-sequence
sequence - 正常なシーケンス
from-end - generalized-boolean、デフォルトはfalse
test - 2つの引数を取りgeneralized-booleanを返却する関数の指定子
test-not - 2つの引数を取りgeneralized-booleanを返却する関数の指定子
start, end - sequenceの境界インデックス指定子。
デフォルトはstart, endそれぞれ0
とnil
。
key - 1つの引数を取る関数の指定子、またはnil
result-sequence - シーケンス
remove-duplicates
は、
他の要素とマッチするような要素を削除した
sequenceのコピーを返却します。
もしsequenceがvector
のとき、返却値はvector
であり、
sequenceと同じ実際の配列の要素の型を持ちます。
もしsequenceがリストなら、返却値はリストです。
sequenceの要素は対で比較され、 どれか2つが一致すれば、先に発生したものが捨てられます。 ただし,from-endがtrueの場合は、 後に発生したものが捨てられます。
remove-duplicates
とdelete-duplicates
は、
sequenceと同じ型のシーケンスに、
残りのどの2つの要素にもマッチしないように、
十分に要素取り除いた内容のものを返却します。
返却値に残った要素の順序は、sequenceに現れるものと同じです。
remove-duplicates
の返却値は、sequenceを共有するかもしれません。
もし要素に削除が生じなかったときは、
入力のsequenceと同一のものが返却される可能性があります。
delete-duplicates
は、sequenceがリストのときは、
sequenceのトップレベルのリスト構造の
どのcar
, cdr
でもsetf
することが許されています。
もしsequenceがvector
のときは、
delete-duplicates
はvector
の次元を変更し、
その要素を並べ替えをせず、新しい位置にスライドして
返却値のvector
を構築することが許されています。
(remove-duplicates "aBcDAbCd" :test #'char-equal :from-end t) => "aBcD"
(remove-duplicates '(a b c b d d e)) => (A C B D E)
(remove-duplicates '(a b c b d d e) :from-end t) => (A B C D E)
(remove-duplicates '((foo #\a) (bar #\%) (baz #\A))
:test #'char-equal :key #'cadr) => ((BAR #\%) (BAZ #\A))
(remove-duplicates '((foo #\a) (bar #\%) (baz #\A))
:test #'char-equal :key #'cadr :from-end t) => ((FOO #\a) (BAR #\%))
(setq tester (list 0 1 2 3 4 5 6))
(delete-duplicates tester :key #'oddp :start 1 :end 6) => (0 4 5 6)
delete-duplicates
は、sequenceを破壊的に修正するかもしれません。
なし。
sequenceが正常なシーケンスでないとき、
型type-error
のエラーが発生します。
3.2.1. コンパイラーの用語, 3.6. 横断の規則と副作用
もしsequenceがvector
なら、
返却値はsimple
かもしれませんし、そうでないかもしれません。
また、返却値はsequenceと同一かもしれませんし、
そうでないかもしれません。
:test-not
パラメーターは非推奨です。
これらの関数は、sequenceを集合で表現される 標準形に変換するのに便利です。