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]的情况?
答案 0 :(得分:6)
正如火星所说,这是为了提高效率。直接调度比使用apply
更快。展开这样的函数对于提高性能非常普遍,juxt
以类似的方式展开。