定义Comp时为什么会这么多?

时间:2015-10-07 06:20:15

标签: clojure

Clojure本身的core.clj代码(可在https://github.com/clojure/clojure/blob/clojure-1.7.0/src/clj/clojure/core.clj获得)给出comp的以下定义:

    (defn comp
     "Takes a set of functions and returns a fn that is the composition
       of those fns.  The returned fn takes a variable number of args,
       applies the rightmost of fns to the args, the next
       fn (right-to-left) to the result, etc."
       {:added "1.0"
        :static true}
       ([] identity)
       ([f] f)
       ([f g] 
          (fn 
            ([] (f (g)))
            ([x] (f (g x)))
            ([x y] (f (g x y)))
            ([x y z] (f (g x y z)))
            ([x y z & args] (f (apply g x y z args)))))
       ([f g & fs]
          (reduce1 comp (list* f g fs))))

我是Clojure的新手并试图了解它的技术方面和习惯风格方面,我想知道包含这么多情况的原因是什么,当两个函数传递到comp时。为什么要干扰[x y]和[x y z]的情况?

1 个答案:

答案 0 :(得分:6)

正如火星所说,这是为了提高效率。直接调度比使用apply更快。展开这样的函数对于提高性能非常普遍,juxt以类似的方式展开。