LISP:从已存在于另一个列表中的列表中删除元素

时间:2014-11-10 01:53:49

标签: list duplicates lisp project remove-if

任何人都可以向我解释原因:

(remove-if #'(lambda (var) (member var (list "x"))) (list "x" "y" "z"))

返回:

("x" "y" "z")

但是这个:

(remove-if #'(lambda (var) (member var (list 1))) (list 1 2 4))

返回:

(2 4)

1 个答案:

答案 0 :(得分:4)

答案

:test #'equal传递给member

(remove-if #'(lambda (var) (member var (list "x") :test #'equal)) (list "x" "y" "z"))
==> ("y" "z")

请注意

(eql "x" "x")
==> NIL
(equal "x" "x")
==> T
(eql 1 1)
==> T

原因

默认One-Argument Test in Common Lisp is eql

这是ANSI CL标准提供的4(!)通用比较功能之间最合理的选择:

  • eq过于依赖于实现,并且不像人们想要的数字和字符那样工作
  • equalequalp遍历对象,因此对于大型对象需要花费很长时间,并且可能永远不会终止循环对象。

另见the difference between eq, eql, equal, and equalp in Common Lisp

正确的方式

使用set-difference代替remove-if + member

相关问题