这个Clojure表单如何工作?从其他列表中删除列表

时间:2015-04-13 22:31:33

标签: clojure

我正在为课程做一个项目,我偶然发现了一些已被证明有用的代码,但我不确定下面的行如何“读取”。我理解它的作用的结果,但不知道它是如何做到的。

(remove #(some (partial = %) '(1 2 3 4)) '(1 2 3 5 6 7))

它的作用是从第二组中删除第一组中的值(如果可能)。因此,给定两组PV,它会找到P / V

我想我正在寻找正在发生的事情的英语句子?

编辑:标题。此外,我确实理解了删除的作用,给定一些谓词如pos?,它返回一个懒惰的项目序列,在应用谓词时等于true。

我特别不明白的是#(some (partial = %))如何评估谓词。

1 个答案:

答案 0 :(得分:5)

#(some (partial = %) '(1 2 3 4))

...是......的语法糖。

(fn [x] (some (partial = x) '(1 2 3 4))

...所以,致电

(#(some (partial = %) '(1 2 3 4)) 5)

... ...运行

(some (partial = 5) '(1 2 3 4))

...因此,对(partial = 5)中的每个条目运行'(1 2 3 4),直到找到匹配为止:(= 5 1)(= 5 2)等 - 并返回{ {1}}当没有返回匹配时。

nil是假的。因此,任何不存在匹配的序列元素将返回false,并由nil保留,而对于存在匹配的任何内容,谓词将返回true并被删除。


显然,为一个序列中的每个项创建一个lambda函数,并根据另一个序列的内容评估这些函数,与实际集算术相比,非常效率低。因此,在任何可能非常重要的项目数量的情况下,不应使用此代码。

相反:

remove

......将是有效和惯用的方法。如果您从列表开始而不是设置文字,则可能会替换为(clojure.set/difference #{1 2 3 4 5 6 7} #{1 2 3 4}) (clojure.set/difference (into #{} list-a) (into #{} list-b))