可能重复:
Why clojure's vector function definition is so verbose?
为了澄清我的问题,我们以list*
的定义为例。
(defn list*
"Creates a new list containing the items prepended to the rest, the
last of which will be treated as a sequence."
{:added "1.0"
:static true}
([args] (seq args))
([a args] (cons a args))
([a b args] (cons a (cons b args)))
([a b c args] (cons a (cons b (cons c args))))
([a b c d & more]
(cons a (cons b (cons c (cons d (spread more)))))))
我的问题是,为什么不这样定义list*
:
(defn list*
"Creates a new list containing the items prepended to the rest, the
last of which will be treated as a sequence."
{:added "1.0"
:static true}
([args] (seq args))
([a & more] (cons a (spread more))))
答案 0 :(得分:5)
主要原因是表现。
如果您明确提供一些小型arities的额外版本(特别是因为小型arity案例是最常用的),它可以帮助Clojure编译器创建更优化的代码。
如果重载版本避免需要处理可变长度参数列表(& more),则尤其如此,因为处理可变长度参数列表会导致比正常位置参数更多的开销。