欢迎!请参阅关于页面,了解更多关于这个网站的信息。
对于比较运算符(= < <= > >= ==),三个或以上的参数比执行如(and (< a b) (< b c))慢得多。在我的研究中,arity 3相对较少,但仍在例如Manifold stream.clj [0]或rrb_vector rrbt.clj [1]中使用。在比较"变量"的下界和上界的地方,arity 3是惯用的。然而,我不认为arity 4及以上在实际代码中使用得很多。至少,我还没找到任何有趣的使用实例。
= < <= > >= ==
(and (< a b) (< b c))
一个示例实现(基于核心库当前的一个)可以是
(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
Jira 在 https://clojure.atlassian.net/browse/CLJ-2827