为什么clojure的向量函数定义如此冗长?

时间:2012-07-19 23:28:11

标签: clojure

我真的很好奇为什么vector的实现如此冗长?是什么原因造成[][a][a & args]

以下是我从clj-1.4.0获得的内容。

=> (source vector)
(defn vector
  "Creates a new vector containing the args."
  {:added "1.0"
   :static true}
  ([] [])
  ([a] [a])
  ([a b] [a b])
  ([a b c] [a b c])
  ([a b c d] [a b c d])
  ([a b c d & args]
     (. clojure.lang.LazilyPersistentVector (create (cons a (cons b (cons c (cons d args))))))))
nil

2 个答案:

答案 0 :(得分:10)

前几个案例有直接调用使它们更快,因为它们是最常见的。使用多个参数调用它的极少数情况可能需要更多调用,因此需要更多时间,但这使常见案例简洁。 这是一种刻意的速度,冗长的权衡。它还可以通过查看参数列表来清楚地使用该函数,而不会使人们的IDE与大量的arity混淆。

Clojure的大部分核心功能都有相似的签名。

答案 1 :(得分:0)

@ArthurUlfeldt's solution之后。

核心函数有参考实现,例如在命名空间clojure.core.reference中。这些将更短,因此更清晰,但比标准对应物慢。测试制度将确保他们产生相同的结果。

例如,vector的参考实现可能是

(ns clojure.core.reference)

(defn vector
  "Creates a new vector containing the args."
  {:added "1.0"
   :static true}
  [& args]
  (. clojure.lang.LazilyPersistentVector (create args)))

除了测试核心库所采用的各种优化和加速之外,参考实现还是那些试图理解代码功能的人的第一个调用端口。