2014-12-06 40 views
0

我正在做關於clojure(初學者)的一些研究,並且我找到了一個示例,我無法理解「(str%2%1)」中「%2」和「%1」的值是什麼。的完整的例子如下:Clojure示例:我無法理解「(str%2%1)」中的「%2」和「%1」的值是什麼

(defn my-reverse [s] 
    (let [lst (list)] 
    (reduce #(str %2 %1) 
      (mapcat #(conj lst %1) s)))) 

據我所知,%2指的是第二個參數,但我只看到「#(STR%2%1)」,這是會員名:mapcat表達後一個參數值,這應該是%1。

感謝您的幫助。希望我已經清楚。

回答

3

#(str %2 %1)是第一個參數到reduce

(減少˚FCOLL)

˚F應的2個參數的函數...返回施加 F到第一2項的結果在COLL,然後將f應用到該結果和 第三項等

所以一個參數f是PROC的電流值ess(集合coll中的當前項目),另一個是到目前爲止的累計結果。

在這種情況下(mapcat #(conj lst %1) s)的結果是集合。在第一次調用#(str %2 %1)時,參數%1%2將成爲該集合中的前兩個值。下一次將使用該結果和集合中的第三個值調用它。從而建立一個包含(mapcat #(conj lst %1) s)生成的所有值的字符串。

3

符號#(...)是創建匿名函數的簡寫。

的時間越長的方式來創建一個匿名函數是一個lambda表達式,用符號fn Clojure中介紹:

(fn [arg1 arg2] 
    (do-something-with arg1 arg2)) 

速記讓你忽略了fn和參數列表,使用默認參數名稱,而不是:

#(do-something-with %1 %2) 

所以,你的例子擴充:

#(str %2 %1) 

膨脹以

(fn [thing1 thing2] 
    (str thing2 thing1)) 

#(conj lst %1) 

膨脹以

(fn [thing] 
    (conj lst thing)) 
相關問題