2

任何人都可以向我解释为什么会这样:

(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)

?

4

1 回答 1

4

答案

传递:test #'equalmember

(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

原因

Common Lisp 中默认的单参数测试是eql.

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

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

另请参阅Common Lisp 中之间的区别eqeqlequalequalp

正确的方式

使用set-difference而不是remove-if+ member

于 2014-11-10T02:55:50.880 回答