Clojure:是否有任何理由在函数定义中详细说明参数?
Clojure : Is there any reason to detail arities in functions definition?
我目前正在编写参数数量未定义的函数,所以我在 clojure.core 等中寻找示例。
例如 comp
(clojure.core)
的定义
(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))))
如您所见,对于参数 [f g],代码详细说明了 2 和 3 个参数 (x y ; x, y, z) 的值,即使它可以直接跳转到 [x & args] .
是否有任何性能原因?还是约定俗成?
我想调用 apply
可能会影响性能,我不知道。
我们在现实生活中一般最多使用3D函数和2个函数的组合,可能是因为这样吧。
谢谢
Clojure 的核心库通常以不是特别惯用的方式实现,特别是出于性能原因。如果您编写的函数将成为程序中大部分代码行的基础,您也可以这样做,但通常这并不优雅,也不特别建议这样做。
我目前正在编写参数数量未定义的函数,所以我在 clojure.core 等中寻找示例。
例如 comp
(clojure.core)
(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))))
如您所见,对于参数 [f g],代码详细说明了 2 和 3 个参数 (x y ; x, y, z) 的值,即使它可以直接跳转到 [x & args] .
是否有任何性能原因?还是约定俗成?
我想调用 apply
可能会影响性能,我不知道。
我们在现实生活中一般最多使用3D函数和2个函数的组合,可能是因为这样吧。
谢谢
Clojure 的核心库通常以不是特别惯用的方式实现,特别是出于性能原因。如果您编写的函数将成为程序中大部分代码行的基础,您也可以这样做,但通常这并不优雅,也不特别建议这样做。