2024Clojure状态调查!中分享你的想法。

欢迎!请参阅关于页面了解有关此内容的一些更多信息。

0
algo.generic

clojure.algo.generic.math-functions/abs 在以下情况下无法工作
clojure.lang.Ratio
clojure.lang.BigInt
java.math.BigDecimal
java.math.BigInteger
我为这些类定义了普通的 defmethods,以及一个 java.lang.Number 的 defmethods,以保留其他数字类的先前功能。

clojure.algo.generic.math-functions/round 在以下情况下无法工作
clojure.lang.Ratio
clojure.lang.BigInt
java.math.BigDecimal
java.math.BigInteger
Java各种整数类(为什么 round 应该在整数上工作?)
我定义了普通的 defmethods 以将 java.Math.round 代理给 double 和 float,在其他整数类上作为恒等操作,将 java.math.BigDecimal#round 代理给 BigDecimal,并将 Ratio 转换为 double 或 BigDecimal 并对其进行四舍五入。

6个答案

0

评论者:seancorfield

我已提醒Cort,他需要获得补丁的签名CA才能使用。

0

评论者:seancorfield

看起来这个补丁与Clojure 1.2不兼容:http://build.clojure.org/job/algo.generic-test-matrix/137/

现在有几个 Contrib 项目正在停止对 1.2 的支持,所以如果你不修改代码,这是一个合理的选择。

0

评论者:spellman

看起来BigInt在Clojure 1.3中被引入:https://github.com/clojure/clojure/commits/master/src/jvm/clojure/lang/BigInt.java

大家认为什么做法是好的呢?

0

评论者:spellman

当我注释掉BigInt相关代码时,在Clojure 1.2下通过测试。

我尝试了

    *  conditionally making defmethods for BigInt based on the Clojure minor version
    *  putting the defmethods for BigInt inside of a try

在任一情况下,我都会得到ClassNotFoundException。

你们会如何做呢?

0

评论者:spellman

新补丁(基于master分支,而非首个补丁)。我在Clojure 1.2 - 1.7下看到测试通过。
对于1.1版本,测试失败,错误信息为clojure.core/spit未定义。

我通过使用java.lang.Class/forName检查BigInt是否存在,条件性地创建了BigInt的defmethods。我使用eval创建了abs的defmethod;round无需这样做。

我不知道这是否是习惯用法,并欢迎改进:)
我尝试了java.lang.Class/forName和.getMethod的组合,但无法使其工作。

希望这有助于!

0
参考: https://clojure.atlassian.net/browse/ALGOG-12(由spellman报告)
...