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