配列から指定条件を満たす要素を取り除く - 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)