Clojure学习之比线性箭头操做

1. 单箭头( -> )html

  单箭头操做符会把其参数form迭代式地依次插入到相邻的下个一个form中做为该form的第一个参数。这就好像把这些form串起来了,即线性化(Threading)。 因为它老是把前一个参数做为接下来的form的第一个参数插入,这种操做也叫 thread-first 。注意,若是在->的参数序列中存在非form的元素,则->会先把它转化成一个form,而后再把它们串起来,这对下面提到的双箭头操做符也是适用的,好比下面三行代码就是等价的:它们获得的结果都是,(5 4 2 3),请注意前两行对rest使用上的不一样。web

1 (-> [1 2 3] rest (conj 4 5))
2 (-> [1 2 3] (rest)(conj 4 5))
3 (conj (rest [1 2 3]) 4 5)

  其中第一行代码由->操做符串起了[1 2 3]rest(conj 4 5)三个参数。其中第一个为一 vector 数据,第二个为一函数,第三个为一个简单的form。函数

2. 双箭头( ->> )spa

  双箭头操做符与单箭头操做符相似,不过它是把前一个参数form作为最后一个参数插入到接下来的form中的,因此它又叫 thread-last,示例1rest

user=> (->> (range)
            (map #(* % %))
            (filter even?)
            (take 10)
            (reduce +))
1140

;; This expands to:
user=> (reduce +
               (take 10
                     (filter even?
                             (map #(* % %)
                                  (range)))))
1140

 示例2:-> 和 ->> 对比code

1 (->> "hello" (str " jmd"))
2 " jmdhello"
3 user=> (-> "hello" (str " jmd"))
4 => "hello jmd"
相关文章
相关标签/搜索