npt-japanese

% Function REMOVE, REMOVE-IF, REMOVE-IF-NOT, DELETE, DELETE-IF, DELETE-IF-NOT

UP


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それぞれ0nil
count - 整数かnil。デフォルトはnil
key - 1つの引数を取る関数の指定子、またはnil
result-sequence - シーケンス

定義

removeremove-ifremove-if-notは、 sequenceからテストを満たした要素を削除したものを返却します。

deletedelete-ifdelete-if-notは、 それぞれremoveremove-ifremove-if-notに 似ていますが、これらはsequenceを修正します。

もしsequencevectorのとき、返却値はvectorであり、 sequenceと同じ実際の配列の要素の型を持ちます。 もしsequenceがリストなら、返却値はリストです。

from-endtrueのときは、 ただcountが指定されたときが重要になります。 このような場合、右端から(左端ではなく)テストを満たす countの要素だけが削除されます。

countが与えられたとき、削除する要素数を制限できます。 もしテストを満たす要素がcountを越えていたときは、 それらの要素は左端か右端(from-endの値による)から、 ただcountで指定された数だけ削除されます。 もしcount負の値が指定されたときは、 0が指定されたかのようにふるまいます。 もしcountnilのときは、 itemにマッチした全てに影響します。

これらの全ての関数は、削除されなかった要素は、 結果内にsequenceと同じ順序で現れます。

removeremove-ifremove-if-notは、 sequenceと同じ型をもつシーケンスであり、 start, endに囲まれたサブシーケンスのテストを満たし 削除されたもの以外は同じ要素を返却します。 これは非破壊的な操作です。 もし要素の削除が必要になった時は、コピーが返却されます。 removeの返却値は、sequenceを共有するかもしれません。 もし要素に削除が生じなかったときは、 入力のsequenceと同一のものが返却される可能性があります。

deletedelete-ifdelete-if-notは、 sequenceと同じ型をもつシーケンスであり、 start, endに囲まれたサブシーケンスのテストを満たし 削除されたもの以外は同じ要素を返却します。 sequenceは返却値の構築のために破壊されるかもしれません。 しかし、返却値はsequenceと同一の場合もあれば、 そうではない場合もあります。

deleteは、sequenceがリストのときは、 sequenceのトップレベルのリスト構造の どのcar, cdrでもsetfすることが許されています。 もしsequencevectorのときは、 deletevectorの次元を変更し、 その要素を並べ替えをせず、新しい位置にスライドして 返却値の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 ...

副作用

deletedelete-ifdelete-if-notの場合、 sequenceは返却値の構築のために破壊されるかもしれません。

影響

なし。

例外

sequenceが正常なシーケンスでないとき、 型type-errorのエラーを通知する準備をしなければなりません。

参考

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

備考

もしsequencevectorなら、 返却値はsimpleかもしれませんし、そうでないかもしれません。 また、返却値はsequenceと同一かもしれませんし、 そうでないかもしれません。

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

関数delete-if-notremove-if-notは非推奨です。


TOP, Github