谁能给我解释一下为什么会这样:
(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)发布于 2014-11-10 10:55:51
答案
将: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。
这是4(!)之间最合理的选择ANSI CL标准提供的通用比较函数:
eq过于依赖于实现,在数字和charactersequal和equalp遍历对象时不会像人们希望的那样工作,因此对于大型对象需要很长时间,对于循环对象可能永远不会终止。另请参见the difference between eq, eql, equal, and equalp in Common Lisp。
正确的方式
使用set-difference而不是remove-if + member。
https://stackoverflow.com/questions/26835587
复制相似问题