我正在尝试从列表或集合中删除元素,如下所示:
(remove :Veronica (list :Veronica :Hailey))
它不起作用,因此,我去了删除文档,说我需要将谓词传递给remove函数。但是以下代码有效:
(remove #{:foo} [:foo :bar])
(remove #{:foo} (list :foo :bar))
#{:foo}是一组。为什么行得通?
是一个功能吗?
谢谢
最佳答案
为什么下面
(remove :Veronica (list :Veronica :Hailey))
;(:Veronica :Hailey)
诸如
:Veronica
之类的关键字是一种接受一个参数的函数,因此可以用作谓词。但是...
例如,
(:Veronica #{:Veronica})
;:Veronica
(:Veronica #{1 2 "Buckle my shoe"})
;nil
它还宽恕了无用的参数:
(:Veronica 4) ; 4 is not a map or set.
;nil
因此
(:Veronica :Veronica)
和(:Veronica :Hailey)
都是nil
,因此(remove :Veronica (list :Veronica :Hailey))
...不会做任何事情,因为谓词总是评估false(ish)。
其他解决方案说明了原因
(remove #{:foo} (list :foo :bar))
...具有您想要的效果。