我正在为课程做一个项目,我偶然发现了一些已被证明有用的代码,但我不确定下面的行如何"读取".我理解它的作用的结果,但不知道它是如何做到的.
(remove #(some (partial = %) '(1 2 3 4)) '(1 2 3 5 6 7))
Run Code Online (Sandbox Code Playgroud)
它的作用是从第二组中删除第一组中的值(如果可能).所以给定两套P,V它找到了P / V.
我想我正在寻找正在发生的事情的英语句子?
编辑:标题.此外,我确实理解了删除的作用,给定一些谓词,例如pos?它返回一个懒惰的项目序列,在应用谓词时等于true.
我特别不明白的是如何#(some (partial = %))评估谓词.
#(some (partial = %) '(1 2 3 4))
Run Code Online (Sandbox Code Playgroud)
...是...的语法糖
(fn [x] (some (partial = x) '(1 2 3 4))
Run Code Online (Sandbox Code Playgroud)
......所以,打电话
(#(some (partial = %) '(1 2 3 4)) 5)
Run Code Online (Sandbox Code Playgroud)
... ...运行
(some (partial = 5) '(1 2 3 4))
Run Code Online (Sandbox Code Playgroud)
...因此,运行(partial = 5)针对每个项目'(1 2 3 4),直到它找到一个匹配-这样的:(= 5 1),(= 5 2)等等-并返回nil返回不匹配时.
nil是假的.因此,任何不存在匹配的序列元素将返回false,并保留remove,而对于存在匹配的任何内容,谓词将返回true并被删除.
显然,与实际集算术相比,为一个序列中的每个项创建一个lambda函数并根据另一个序列的内容评估这些函数是非常低效的.因此,在任何项目数量可能非常重要的情况下,不应使用此代码.
代替:
(clojure.set/difference
#{1 2 3 4 5 6 7}
#{1 2 3 4})
Run Code Online (Sandbox Code Playgroud)
......将是有效和惯用的方法.如果您从列表而不是集合文字开始,那么可能会用(clojure.set/difference (into #{} list-a) (into #{} list-b))或替换(clojure.set/difference (set list-a) (set list-b)).