7

我真的很好奇为什么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
4

2 回答 2

10

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

Clojure 的大部分核心函数都有类似的签名。

于 2012-07-19T23:40:48.703 回答
0

除了@ArthurUlfeldt 的解决方案

有一个核心功能的参考实现的案例,比如在 namespace 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)))

除了测试核心库采用的各种优化和加速之外,参考实现将是那些试图理解代码功能的人的首选。

于 2014-07-04T08:06:03.573 回答