2013-06-04 38 views
3

如果我有一個計算結果爲功能Clojure的功能讓我們結合

(defn func1 [c1 c2] 
    (fn [x1 x2] 
    ...do some stuff with c1 c2 x1)) 

,我在地圖上的其他地方使用或減少的功能,是它更好地使用內聯

(defn func2 [x y z] 
    (reduce (func1 x y) z (range 20))) 

或讓其綁定第一

(defn func2 [x y z] 
    (let [ffunc (func1 x y)] 
    (reduce ffunc z (range 20)))) 

在第一種情況下,超過x和y的新函數生成的每個步長t我會擔心通過減少。

回答

3

函數調用(func1 x y)的評估在每種情況下完成一次。

在Clojure中評估函數調用的規則包括評估作爲參數提供的所有表達式,然後使用這些值調用函數。

如果定義了以下高階函數:

(defn plus [] 
    (println "calling plus") 
    +) 

然後調用減少下列方式:

(reduce (plus) [0 1 2 3]) 

calling plus打印,顯示功能plus被調用一次。

(let [f (plus)] 
    (reduce f [0 1 2 3])) 

希望它能幫助:使用let形式時

同樣的事情發生。

+0

是的,這正是我一直在尋找的。從來沒有想過用副作用來測試它。謝謝。 –

+0

請注意,實例化函數通常都很便宜,所以即使分配了多個函數,也不會有什麼大不了的。很顯然,你可以構造構建起來很昂貴的函數,但並不是每次都必須重新編譯函數(我提到這一點是因爲新手每次構建函數時都會關閉它們編譯的東西)。 – amalloy