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"
相關文章
相關標籤/搜索