Function REMOVE
remove
item sequence &key from-end test test-not start end count key => result-sequence
remove-if
predicate sequence &key from-end start end count key => result-sequence
remove-if-not
predicate sequence &key from-end start end count key => result-sequence
delete
item sequence &key from-end test test-not start end count key => result-sequence
delete-if
predicate sequence &key from-end start end count key => result-sequence
delete-if-not
predicate sequence &key from-end start end count key => result-sequence
item - オブジェクト
sequence - 正常なシーケンス
predicate - 1つの引数をとりgeneralized-booleanを返却する関数の指定子
from-end - generalized-boolean、デフォルトはfalse
test - 2つの引数を取りgeneralized-booleanを返却する関数の指定子
test-not - 2つの引数を取りgeneralized-booleanを返却する関数の指定子
start, end - sequenceの境界インデックス指定子。 デフォルトはstart, endそれぞれ0
とnil
。
count - 整数かnil
。デフォルトはnil
。
key - 1つの引数を取る関数の指定子、またはnil
result-sequence - シーケンス
remove
、remove-if
、remove-if-not
は、 sequenceからテストを満たした要素を削除したものを返却します。
delete
、delete-if
、delete-if-not
は、 それぞれremove
、remove-if
、remove-if-not
に 似ていますが、これらはsequenceを修正します。
もしsequenceがvector
のとき、返却値はvector
であり、 sequenceと同じ実際の配列の要素の型を持ちます。 もしsequenceがリストなら、返却値はリストです。
from-endがtrueのときは、 ただcountが指定されたときが重要になります。 このような場合、右端から(左端ではなく)テストを満たす countの要素だけが削除されます。
countが与えられたとき、削除する要素数を制限できます。 もしテストを満たす要素がcountを越えていたときは、 それらの要素は左端か右端(from-endの値による)から、 ただcountで指定された数だけ削除されます。 もしcount負の値が指定されたときは、 0
が指定されたかのようにふるまいます。 もしcountがnil
のときは、 itemにマッチした全てに影響します。
これらの全ての関数は、削除されなかった要素は、 結果内にsequenceと同じ順序で現れます。
remove
、remove-if
、remove-if-not
は、 sequenceと同じ型をもつシーケンスであり、 start, endに囲まれたサブシーケンスのテストを満たし 削除されたもの以外は同じ要素を返却します。 これは非破壊的な操作です。 もし要素の削除が必要になった時は、コピーが返却されます。 remove
の返却値は、sequenceを共有するかもしれません。 もし要素に削除が生じなかったときは、 入力のsequenceと同一のものが返却される可能性があります。
delete
、delete-if
、delete-if-not
は、 sequenceと同じ型をもつシーケンスであり、 start, endに囲まれたサブシーケンスのテストを満たし 削除されたもの以外は同じ要素を返却します。 sequenceは返却値の構築のために破壊されるかもしれません。 しかし、返却値はsequenceと同一の場合もあれば、 そうではない場合もあります。
delete
は、sequenceがリストのときは、 sequenceのトップレベルのリスト構造の どのcar
, cdr
でもsetf
することが許されています。 もしsequenceがvector
のときは、 delete
はvector
の次元を変更し、 その要素を並べ替えをせず、新しい位置にスライドして 返却値のvector
を構築することが許されています。
delete-ifは以下のように正確に動作するように制約されています。
delete nil sequence
(:test #'(lambda (ignore item) (funcall test item))
...)
remove 4 '(1 3 4 5 9)) => (1 3 5 9)
(remove 4 '(1 2 4 1 3 4 5)) => (1 2 1 3 5)
(remove 4 '(1 2 4 1 3 4 5) :count 1) => (1 2 1 3 4 5)
(remove 4 '(1 2 4 1 3 4 5) :count 1 :from-end t) => (1 2 4 1 3 5)
(remove 3 '(1 2 4 1 3 4 5) :test #'>) => (4 3 4 5)
(setq lst '(list of four elements)) => (LIST OF FOUR ELEMENTS)
(setq lst2 (copy-seq lst)) => (LIST OF FOUR ELEMENTS)
(setq lst3 (delete 'four lst)) => (LIST OF ELEMENTS)
(equal lst lst2) => false
(remove-if #'oddp '(1 2 4 1 3 4 5)) => (2 4 4)
(remove-if #'evenp '(1 2 4 1 3 4 5) :count 1 :from-end t)
(=> (1 2 4 1 3 5)
remove-if-not #'evenp '(1 2 3 4 5 6 7 8 9) :count 2 :from-end t)
(=> (1 2 3 4 5 6 8)
setq tester (list 1 2 4 1 3 4 5)) => (1 2 4 1 3 4 5)
(delete 4 tester) => (1 2 1 3 5)
(setq tester (list 1 2 4 1 3 4 5)) => (1 2 4 1 3 4 5)
(delete 4 tester :count 1) => (1 2 1 3 4 5)
(setq tester (list 1 2 4 1 3 4 5)) => (1 2 4 1 3 4 5)
(delete 4 tester :count 1 :from-end t) => (1 2 4 1 3 5)
(setq tester (list 1 2 4 1 3 4 5)) => (1 2 4 1 3 4 5)
(delete 3 tester :test #'>) => (4 3 4 5)
(setq tester (list 1 2 4 1 3 4 5)) => (1 2 4 1 3 4 5)
(delete-if #'oddp tester) => (2 4 4)
(setq tester (list 1 2 4 1 3 4 5)) => (1 2 4 1 3 4 5)
(delete-if #'evenp tester :count 1 :from-end t) => (1 2 4 1 3 5)
(setq tester (list 1 2 3 4 5 6)) => (1 2 3 4 5 6)
(delete-if #'evenp tester) => (1 3 5)
(=> implementation-dependent
tester setq foo (list 'a 'b 'c)) => (A B C)
(setq bar (cdr foo)) => (B C)
(setq foo (delete 'b foo)) => (A C)
(=> ((C)) or ...
bar eq (cdr foo) (car bar)) => T or ... (
delete
、delete-if
、delete-if-not
の場合、 sequenceは返却値の構築のために破壊されるかもしれません。
なし。
sequenceが正常なシーケンスでないとき、 型type-error
のエラーを通知する準備をしなければなりません。
3.2.1. コンパイラーの用語, 3.6. 横断の規則と副作用
もしsequenceがvector
なら、 返却値はsimple
かもしれませんし、そうでないかもしれません。 また、返却値はsequenceと同一かもしれませんし、 そうでないかもしれません。
:test-not
パラメーターは非推奨です。
関数delete-if-not
とremove-if-not
は非推奨です。