这个Clojure表单是如何工作的?从另一个列表中删除列表
我正在为班级做一个项目,我偶然发现了一些被证明是有用的代码,尽管我不确定下面这行是如何读的。我理解它所做的结果,但不理解它是如何做的这个Clojure表单是如何工作的?从另一个列表中删除列表,clojure,Clojure,我正在为班级做一个项目,我偶然发现了一些被证明是有用的代码,尽管我不确定下面这行是如何读的。我理解它所做的结果,但不理解它是如何做的 (remove #(some (partial = %) '(1 2 3 4)) '(1 2 3 5 6 7)) 如果可能的话,它会从第一个集合中的第二个集合中删除值。因此,给定两组P和V,它会找到P/V 我想我正在寻找一个关于发生了什么的英语句子 编辑:标题。此外,我也理解remove的作用,因为它会返回一个惰性的项序列,当应用谓词时,这些项序列等同于true
(remove #(some (partial = %) '(1 2 3 4)) '(1 2 3 5 6 7))
如果可能的话,它会从第一个集合中的第二个集合中删除值。因此,给定两组P
和V
,它会找到P/V
我想我正在寻找一个关于发生了什么的英语句子
编辑:标题。此外,我也理解remove的作用,因为它会返回一个惰性的项序列,当应用谓词时,这些项序列等同于true
我特别不理解的是#(some(partial=%)
如何计算为谓词
#(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))
…因此,对'(1 2 3 4)
中的每个条目运行(partial=5)
,直到它找到一个匹配项——因此:(=5 1)
,(=5 2)
,等等——并在没有返回匹配项时返回nil
nil
是错误的。因此,不存在匹配项的任何序列元素都将返回false,并由remove
保留,而对于存在匹配项的任何元素,谓词都将返回true并被删除
显然,与实数集算法相比,为一个序列中的每个项创建lambda函数并根据另一个序列的内容计算这些函数的效率极低。因此,此代码不应用于项目数量可能不常见的任何情况 相反:
(clojure.set/difference
#{1 2 3 4 5 6 7}
#{1 2 3 4})
…将是有效且惯用的方法。如果你是从一个列表而不是一个集合文字开始的,那么它可能会被替换为
(clojure.set/difference(into{}list-a)(into{list-b))
或者(clojure.set/difference(set list-a)(set-b))
?这些是列表,不是集合{1 2 3 4}
将是一个集合,使用它们进行集合逻辑将有更高效的本机操作。除此之外,如果您写出您所知道/理解的内容,这将非常有用,因此回答此问题的人知道不需要回答的内容。你知道#(foo%)
做什么吗?您知道remove
的作用吗?你知道partial
做什么吗?等。我做了一些编辑来反映这些问题。像往常一样-从里到外阅读clojure代码#(部分(partial=%)
->partial的用途是什么?(部分=值)
用于什么?