【问题标题】:Why clojure's vector function definition is so verbose?为什么clojure的向量函数定义这么冗长?
【发布时间】:2012-07-19 23:28:10
【问题描述】:

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

【问题讨论】:

标签: clojure


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    进一步@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)))
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-13
      • 2014-04-11
      • 1970-01-01
      • 2023-03-20
      • 2012-09-09
      • 2011-03-13
      相关资源
      最近更新 更多