Lisp delete if中谓词的多个参数

Lisp delete if中谓词的多个参数,lisp,common-lisp,sbcl,Lisp,Common Lisp,Sbcl,假设我想从状态列表中删除一个步骤(元素) (defparameter *states* '((:top nil nil) (:subjects nil nil))) ;predicate (defun equal-state? (step state) (equal (car step) state)) 如果我使用(删除If#'equal-state?*states*),那么如何将第二个参数(state)传递给谓词 编辑:我终于找到了一个类似的问题,但我倾向于保留它,因为问题很清楚 CL

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

(defparameter *states* '((:top nil nil) (:subjects nil nil)))
 ;predicate
(defun equal-state? (step state)
  (equal (car step) state))
如果我使用
(删除If#'equal-state?*states*)
,那么如何将第二个参数(
state
)传递给谓词

编辑:我终于找到了一个类似的问题,但我倾向于保留它,因为问题很清楚

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

正如用户coredump所提到的,
如果
是一个潜在的破坏性操作,则删除。
删除if
的非破坏性替代方法是
删除if

还可以使用
删除
/
删除

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

正如用户coredump所提到的,
如果
是一个潜在的破坏性操作,则删除。
删除if
的非破坏性替代方法是
删除if

还可以使用
删除
/
删除

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

注意。在本例中,您正在使用DELETE,DELETE被授权对数据进行变异,但您的数据是常量(引用列表),不应在portable programs.NB中进行修改。在本例中,您正在使用DELETE,DELETE有权修改数据,但您的数据是常量(引用列表),不应在可移植程序中修改。@coredump提示不应在可移植程序中修改常量数据。。。我的lisp实现还警告我常量数据。。我就是不能把我的头绕在它周围。。和“可移植程序中的常量数据?”@BilalQadri:如果您的程序中写入了
”(a b c)
,则它是一个引用列表。此列表是文本数据。如果您修改它,会发生什么,这是未知的。可能会起作用,可能会产生副作用,可能会无声地失败,可能会导致错误。未指明。将创建一个新列表,其中包含诸如list、COPY-list和许多其他函数。如果您键入一个文本列表来REPL,您很有可能修改它而不会看到问题,但通常情况并非如此。特别是在编译代码中,它可能会导致问题。这不是Lisp特有的。其他语言也有类似的问题。@coredump暗示不应该在可移植程序中修改常量数据。。。我的lisp实现还警告我常量数据。。我就是不能把我的头绕在它周围。。和“可移植程序中的常量数据?”@BilalQadri:如果您的程序中写入了
”(a b c)
,则它是一个引用列表。此列表是文本数据。如果您修改它,会发生什么,这是未知的。可能会起作用,可能会产生副作用,可能会无声地失败,可能会导致错误。未指明。将创建一个新列表,其中包含诸如list、COPY-list和许多其他函数。如果您键入一个文本列表来REPL,您很有可能修改它而不会看到问题,但通常情况并非如此。特别是在编译代码中,它可能会导致问题。这不是Lisp特有的。其他语言也有类似的问题。