Clojure:有什么理由在函数定义中详细说明算术吗?

Clojure:有什么理由在函数定义中详细说明算术吗?,clojure,arity,Clojure,Arity,我目前正在编写具有未定义的算术数的函数,因此我在clojure.core等中查找了一些示例 例如,这是comp(clojure.core)的定义 如您所见,对于arity[fg],代码详细说明了2和3个参数(xy;x,y,z)的值,即使它可以直接跳到[x&args] 是否存在任何性能原因?还是一个惯例? 我想调用apply可能会影响性能,我不知道 在真实的lif中,我们通常最多使用3D函数和2个函数的组合,可能是因为这个原因 感谢Clojure的核心库通常以不太惯用的方式实现,特别是出于性能原因

我目前正在编写具有未定义的算术数的函数,因此我在clojure.core等中查找了一些示例

例如,这是
comp
(clojure.core)的定义

如您所见,对于arity[fg],代码详细说明了2和3个参数(xy;x,y,z)的值,即使它可以直接跳到[x&args]

是否存在任何性能原因?还是一个惯例? 我想调用
apply
可能会影响性能,我不知道

在真实的lif中,我们通常最多使用3D函数和2个函数的组合,可能是因为这个原因


感谢

Clojure的核心库通常以不太惯用的方式实现,特别是出于性能原因。如果您正在编写一个对程序中的大多数代码行都很重要的函数,您也可以这样做,但一般来说,这并不优雅,也不是特别建议的。

谢谢,对于生产函数中的频繁算术,我使用相同的so
(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))))