delete-if 中谓词的多个参数

More than one argument for predicate in delete-if

假设我想从状态列表中删除一个步骤(元素)。

(defparameter *states* '((:top nil nil) (:subjects nil nil)))
 ;predicate
(defun equal-state? (step state)
  (equal (car step) state))

如果我使用 (delete-if #'equal-state? *states*) 那么如何将第二个参数 (state) 传递给谓词?

已编辑:我终于找到了一个类似的问题,但由于问题的清晰性,我倾向于保留它。

CL-USER 67 > (let ((state :top))
               (delete-if (lambda (step)
                            (equal-state? step state))
                          *states*))
((:SUBJECTS NIL NIL))

CL-USER 68 > (defun make-predicate (state)
               (lambda (step)
                 (equal-state? step state)))
MAKE-PREDICATE

CL-USER 69 > (delete-if (make-predicate :subjects)
                        *states*)
((:TOP NIL NIL))

正如用户 coredump 提到的,delete-if 是一个潜在的破坏性操作。 delete-if 的非破坏性替代方法是 remove-if.

也可以用remove/delete:

CL-USER 77 > (remove :subjects
                     '((:top nil nil)
                       (:subjects nil nil))
                     :key #'first
                     :test #'equal)
((:TOP NIL NIL))