请在 2024 Clojure 状况调查! 中分享您的想法。

欢迎!请参阅 关于 页面以了解更多关于如何使用本网站的信息。

+1
语法和读取器
重新标记

对于比较(= < <= > >= ==),3 参数或更多参数相比于如 (and (< a b) (< b c)) 的实现要慢得多。在我的研究中,3 参数相对较少,但仍被用于例如 Manifold stream.clj [0] 或 rrb_vector rrbt.clj [1]。3 参数在某些地方是惯用的,例如比较“变量”的下界和上界。然而,我认为 4 参数或更多参数在实践代码中用得不多。至少我还没有找到任何有趣的这种用法。

一个示例实现(基于当前核心中的实现)可以是

(defn <'
  "Returns non-nil if nums are in monotonically increasing order,
  otherwise false."
  {:inline         (fn [x y] `(. clojure.lang.Numbers (lt ~x ~y)))
   :inline-arities #{2}
   :added          "1.0"}
  ([x] true)
  ([x y] (. clojure.lang.Numbers (lt x y)))
  ([x y z] (and (<' x y) (<' y z)))
  ([x y z & more]
   (if (<' x y z)
     (if (next more)
       (recur y z (first more) (next more))
       (<' z (first more)))
     false)))

[0] https://github.com/clj-commons/manifold/blob/c3fc69066f3abba0b5ab0f4c2b1c4338bcc61d19/src/manifold/stream.clj#L978
[1] https://github.com/clojure/core.rrb-vector/blob/master/src/main/clojure/clojure/core/rrb_vector/rrbt.clj

1 个回答

0
...