2015-06-13 21 views
4

我偶然發現partial函數的實現在cojure.core。它看起來像這樣:爲什麼這樣實現clojure.core中的部分

(defn partial 
    "Takes a function f and fewer than the normal arguments to f, and 
    returns a fn that takes a variable number of additional args. When 
    called, the returned function calls f with args + additional args." 
    {:added "1.0" 
    :static true} 
    ([f] f) 
    ([f arg1] 
    (fn [& args] (apply f arg1 args))) 
    ([f arg1 arg2] 
    (fn [& args] (apply f arg1 arg2 args))) 
    ([f arg1 arg2 arg3] 
    (fn [& args] (apply f arg1 arg2 arg3 args))) 
    ([f arg1 arg2 arg3 & more] 
    (fn [& args] (apply f arg1 arg2 arg3 (concat more args))))) 

爲什麼它有幾個奇偶校驗選項,如果它可以有一個?它只是性能優化,所以concat不會在大多數情況下被調用?

我的意思是它可能看起來像這樣,否則,對不對?

(defn partial 
    ([f] f) 
    ([f & more] 
    (fn [& args] (apply f (concat more args)))) 
) 

我還注意到其他一些功能遵循相同的模式。

回答

7

是的,這是一個性能優化。

我不只是不打電話concat - 這是關於參數列表中的&需要創建集合的事實。假設該語言的基本組成部分將出現在每個人的性能瓶頸中,clojure核心庫傾向於認真對待性能。