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))
假设我想从状态列表中删除一个步骤(元素)。
(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))