2013-10-11 79 views
36

Clojure中的->->>宏有什麼區別?Clojure中的箭頭和雙箭頭宏的區別

+5

見[Clojure的](HTTP:// clojuredocs。 org/clojure_core/clojure.core/- %3E%3E)[docs](http://clojuredocs.org/clojure_core/clojure.core/-%3E)。 –

回答

65

該文檔A.韋伯鏈接來解釋「什麼」,但沒有做好「爲什麼」。

通常,當一個函數在單個主題上工作時,該主題是第一個參數(例如,conjassoc)。當函數對序列主題起作用時,該主題是最後一個參數(例如,mapfilter)。

因此,->->>分別記錄爲分別對第一個和最後一個參數進行線程化,但將它們分別應用於單數或連續參數也是有用的。

例如,我們可以考慮一個矢量作爲奇異對象:

(-> [1 2 3] 
    (conj 4)   ; (conj [1 2 3] 4) 
    (conj 5)   ; (conj [1 2 3 4] 5) 
    (assoc 0 0))  ; (assoc [1 2 3 4 5] 0 0) 
=> [0 2 3 4 5] 

或者,我們可以把它看成一個序列:

(->> [1 2 3] 
    (map inc)  ; (map inc [1 2 3]) 
    (map inc)  ; (map inc (2 3 4)) 
    (concat [0 2])) ; (concat [0 2] (3 4 5)) 
=> (0 2 3 4 5) 
+19

我傾向於考慮對它們的第一個和第二個參數進行操作的Clojure函數之間的區別,因爲它們是否是高階函數而不是參數是順序函數。 「conj」或「assoc」的第一個參數通常是連續的,「map」或「filter」的第二個參數也是。然而,'map'和'filter'都是更高階的,並將它們的功能參數作爲第一個參數。所以以這種方式來看待它,' - >>'往往被用於鏈接高階函數,否則''>''>。 – jbm

+1

關於單數和順序參數的觀點對我來說很有意義!我現在也看到,爲什麼我對這些宏感到困惑。問題是我只看到了函數f.e.唯一的參數。 '( - > 42 str)'和'( - >> 42 str)'都返回'「42」'。但是當我瀏覽上面的例子時,對我來說事情是顯而易見的。 – avli