Skip to main content
 首页 » 操作系统 » linux系统

Clojure 序列谓词

Clojure 序列谓词  第1张

序列谓词转换函数用于对序列中的值进行转换。

Clojure 序列谓词  第2张

map接受一个源容器coll和一个函数f作为参数,并返回一个新的序列。该序列的所有元素,都是通过对coll中的每个元素调用f得到的。

Clojure 序列谓词  第3张

还可以传入多个容器给map。在这种情况下,f必须是一个多参函数。map会从每个容器分别取出一个值,作为参数来调用f,直到数量最少的那个容器被耗尽为止。

Clojure 序列谓词  第4张

归纳函数reduce

Clojure 序列谓词  第5张

其中f是一个接受两个参数的函数。reduce首先用coll的前两个元素作为参数来调用f,然后用得到的结果和第三个元素作为参数,继续调用f,以此类推。

Clojure 序列谓词  第6张

Clojure 序列谓词  第7张

使用sort或sort-by对容器进行排序

Clojure 序列谓词  第8张

sort 会依据元素的自然顺序对容器进行排序,sort-by 则会对每个元素调用 a-fn,再依据得到的结果序列来进行排序。

Clojure 序列谓词  第9张

如果不打算按照自然顺序排序,可以为sort或sort-by指定一个可选的比较函数comp。

Clojure 序列谓词  第10张

所有过滤和转换的祖先都是列表解析(list comprehension)。

列表解析使用集合记号法(set notation),基于一个已存在的列表来创建新的列表。

换句话说,解析式描述了结果列表必须满足的性质。

一个列表解析会包含以下内容。

● 输入列表。

● 输入列表中元素所对应的占位变量。

● 作用于元素的谓词。

● 一个输出形式,它负责基于那些满足谓词要求的列表元素来产生输出。

当然,Clojure把列表解析的概念泛化为了序列解析(sequencecomprehension)。在Clojure中,是使用for宏来进行解析的。

Clojure 序列谓词  第11张

for 接受一个向量作为参数,该参数是由一系列 binding-form/coll-expr 和可选的filter-expr组成的,然后是依据表达式expr来产生结果序列。

列表解析比诸如 map 和filter 这样的函数更加通用,而且,事实上它可以模拟之前的大多数过滤和转换函数。

Clojure 序列谓词  第12张

这样读起来几乎就像是英语一样:“For [each] word in [a sequence of words]format [according to format instructions]”。即按照格式要求,对一系列单词逐个进行格式化。

借助:when子句,解析也可以用来模拟filter函数。

Clojure 序列谓词  第13张

只要:while字句的表达式保持为真,它就会继续进行求值。

Clojure 序列谓词  第14张

当有多个绑定表达式时,for才会真正地发挥其威力。

Clojure 序列谓词  第15张

序列解析中,Clojure会从按照右到左的顺序,来遍历绑定表达式。由于在绑定形式中,rank列于file的右手边,所以rank会迭代的更快。如果希望让file迭代的更快,可以反转绑定的顺序,把rank列在第一位。

Clojure 序列谓词  第16张

评论列表暂无评论
发表评论
微信