配列から指定条件を満たす要素を取り除く - lisp-cookbook-ja/common-lisp GitHub Wiki
配列から指定条件を満たす要素を取り除く
remove-if delete-if は第1引数に与えられた関数が真(非nil)値を返した要素を除外したベクタを返します。
(let ((a (vector 30 100 50 80 79 40 95)))
(list (remove-if (lambda (x) (< x 80)) a)
a))
;=> (#(100 80 95) #(30 100 50 80 79 40 95))
(let ((a (vector 30 100 50 80 79 40 95)))
(list (delete-if (lambda (x) (< x 80)) a)
a))
;=> (#(100 80 95)
#(100 80 95)) ;処理系依存
delete-if は破壊的に与えられたベクタを変更し結果を生成しますが、変更された元のベクタが結果と一致するとは限りません(処理系依存)ので処理系に依らず確実にしたい場合は、再度代入する必要があります。
(let ((a (vector 30 100 50 80 79 40 95)))
(setq a (delete-if (lambda (x) (< x 80)) a)))
#(100 80 95)