% Function REMOVE, REMOVE-IF, REMOVE-IF-NOT, DELETE, DELETE-IF, DELETE-IF-NOT
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)
tester => implementation-dependent
(setq foo (list 'a 'b 'c)) => (A B C)
(setq bar (cdr foo)) => (B C)
(setq foo (delete 'b foo)) => (A C)
bar => ((C)) or ...
(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
は非推奨です。