这个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的用途是什么?
(部分=值)
用于什么?