为什么Clojure在参数子句中定义具有冗余的函数

时间:2012-08-10 05:58:38

标签: clojure

  

可能重复:
  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))))

1 个答案:

答案 0 :(得分:5)

主要原因是表现

如果您明确提供一些小型arities的额外版本(特别是因为小型arity案例是最常用的),它可以帮助Clojure编译器创建更优化的代码。

如果重载版本避免需要处理可变长度参数列表(& more),则尤其如此,因为处理可变长度参数列表会导致比正常位置参数更多的开销。