谁能向我解释一下为什么会这样:
(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)
?
最佳答案
答案
将 :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(!) 个通用比较函数之间最合理的选择:
另请参阅the difference between eq
, eql
, equal
, and equalp
in Common Lisp .
正确的方法
使用set-difference
而不是 remove-if
+ member
。
关于list - LISP:从另一个列表中已存在的元素中删除元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26835587/