2

可能重复:
为什么 clojure 的向量函数定义如此冗长?

为了澄清我的问题,让我们以定义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))))
4

1 回答 1

5

主要原因是性能

如果您显式提供一些带有小参数的额外版本,它可以帮助 Clojure 编译器创建更优化的代码(特别是因为小参数情况是最常用的)

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

于 2012-08-10T09:10:31.270 回答