序列谓词转换函数用于对序列中的值进行转换。
map接受一个源容器coll和一个函数f作为参数,并返回一个新的序列。该序列的所有元素,都是通过对coll中的每个元素调用f得到的。
还可以传入多个容器给map。在这种情况下,f必须是一个多参函数。map会从每个容器分别取出一个值,作为参数来调用f,直到数量最少的那个容器被耗尽为止。
归纳函数reduce
其中f是一个接受两个参数的函数。reduce首先用coll的前两个元素作为参数来调用f,然后用得到的结果和第三个元素作为参数,继续调用f,以此类推。
使用sort或sort-by对容器进行排序
sort 会依据元素的自然顺序对容器进行排序,sort-by 则会对每个元素调用 a-fn,再依据得到的结果序列来进行排序。
如果不打算按照自然顺序排序,可以为sort或sort-by指定一个可选的比较函数comp。
所有过滤和转换的祖先都是列表解析(list comprehension)。
列表解析使用集合记号法(set notation),基于一个已存在的列表来创建新的列表。
换句话说,解析式描述了结果列表必须满足的性质。
一个列表解析会包含以下内容。
● 输入列表。
● 输入列表中元素所对应的占位变量。
● 作用于元素的谓词。
● 一个输出形式,它负责基于那些满足谓词要求的列表元素来产生输出。
当然,Clojure把列表解析的概念泛化为了序列解析(sequencecomprehension)。在Clojure中,是使用for宏来进行解析的。
for 接受一个向量作为参数,该参数是由一系列 binding-form/coll-expr 和可选的filter-expr组成的,然后是依据表达式expr来产生结果序列。
列表解析比诸如 map 和filter 这样的函数更加通用,而且,事实上它可以模拟之前的大多数过滤和转换函数。
这样读起来几乎就像是英语一样:“For [each] word in [a sequence of words]format [according to format instructions]”。即按照格式要求,对一系列单词逐个进行格式化。
借助:when子句,解析也可以用来模拟filter函数。
只要:while字句的表达式保持为真,它就会继续进行求值。
当有多个绑定表达式时,for才会真正地发挥其威力。
序列解析中,Clojure会从按照右到左的顺序,来遍历绑定表达式。由于在绑定形式中,rank列于file的右手边,所以rank会迭代的更快。如果希望让file迭代的更快,可以反转绑定的顺序,把rank列在第一位。