我正在为课程做一个项目,我偶然发现了一些已被证明有用的代码,但我不确定下面的行如何“读取”。我理解它的作用的结果,但不知道它是如何做到的。
(remove #(some (partial = %) '(1 2 3 4)) '(1 2 3 5 6 7))
它的作用是从第二组中删除第一组中的值(如果可能)。因此,给定两组P
和V
,它会找到P / V
。
我想我正在寻找正在发生的事情的英语句子?
编辑:标题。此外,我确实理解了删除的作用,给定一些谓词如pos?
,它返回一个懒惰的项目序列,在应用谓词时等于true。
我特别不明白的是#(some (partial = %))
如何评估谓词。
答案 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))
。