リストから指定条件を満たす要素を取り除く - lisp-cookbook-ja/common-lisp GitHub Wiki
remove-if delete-if は第1引数に与えられた関数が真(非nil)値を返した要素を除外したリストを返します。
(let ((a (list 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 (list 30 100 50 80 79 40 95)))
(list (delete-if (lambda (x) (< x 80)) a)
a))
;=> ((100 80 95)
(30 100 80 95)) ;処理系依存
delete-if は破壊的に与えられたリストを変更し結果を生成しますが、元のリストが結果と一致するとは限りません(処理系依存)ので確実にしたい場合は、再度代入する必要があります。
(let ((a (list 30 100 50 80 79 40 95)))
(setq a (delete-if (lambda (x) (< x 80)) a)))
;=> (100 80 95)
loop でも書けます。結果のリストは新しく生成されたものです。
(loop for x in (list 30 100 50 80 79 40 95)
unless (< x 80) collect x)
;=> (100 80 95)
;; 条件を満たすものとそうでないものに分割。
(loop for x in (list 30 100 50 80 79 40 95)
unless (< x 80) collect x into i
else collect x into j
finally (return (list i j)))
;=> ((100 80 95) (30 50 79 40))