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

欢迎!请查看关于页面以了解更多信息。

0
Java 互操作

因为比值会化简为最简形式,并且在最简形式为 N/1 的整数值中自动转换为 BigInt(以前是 Long),所以当前 {{clojure.core/numerator}} 和 {{clojure.core/denominator}} 的行为会产生意外的结果。

`
user=> (numerator 1/3)
1
user=> (numerator (+ 1/3 2/3))

ClassCastException clojure.lang.BigInt 不能转换为 clojure.lang.Ratio clojure.core/numerator (core.clj:3306)
user=> (denominator 1/3)
3
user=> (denominator (+ 1/3 2/3))

ClassCastException clojure.lang.BigInt 不能转换为 clojure.lang.Ratio clojure.core/denominator (core.clj:3314)
user=>
`

不支持整数类型上的分子和分母(这要求你总是在调用之前检查 ratio?),这会很令人困惑。

建议:将分子和分母扩展到也可用于整数字型(long, BigInt, BigInteger),通过路由到为期望类型重载的 Numbers 方法。

补丁:clj-1435.patch

审核人:Alex Miller

为 Rich 审核的问题

  1. 分子和分母被标记为返回 java.math.BigInteger(不是 clojure.lang.BigInt),我在补丁中遵循了这一点。但似乎应该是 BigInt,我不确定基于什么做出这个决定。
  2. 分子和分母应该接受 BigInteger 和 BigInt 吗?

13 个答案

0

评论者:jafingerhut

我不知道此票务的官方立场,但将添加一些注释。

Aaron,分子和分母只明确表示它们在 Ratio 类型上工作。

可以很容易地编写 my-numerator 和 my-denominator,它们工作方式正好如你所愿,检查 arg 的类型,并对于 Ratio 类型使用 numerator 和 denominator,对于其他数字类型执行你认为正确的事情。

0

评论者:abrooks

我知道它们的文档就是这样描述的。我的观点的一部分是,你可以在完全使用比例类型的情况下工作,并通过它们之间的算术运算,有时会意外地得到一个非比例数。

同时考虑

user=> (numerator (2/1)) java.lang.ClassCastException: java.lang.Long cannot be cast to clojure.lang.Ratio clojure.core/numerator (core.clj:3238)

然后你只能实现 try/catch 补正或在使用 {{numerator}} 或 {{denominator}} 之前始终检查类型,这将导致性能损失。

我心中的补丁是创建一个协议,扩展到 Ratio、BigInt 和 Long,它调用合适的方法(Ratios)或对于整型返回给定的数字或 1(分子/分母)。我预计这将在它能工作的案例中保持当前的性能水平,并适当地处理当前未处理的案例。

0

评论者:gfredericks

我肯定已经好几次编写了 Andy 描述的辅助函数。

0

评论者:felipelalli

相关问题:https://stackoverflow.com/questions/25194809/how-to-convert-any-number-to-a-clojure-lang-ratio-type-in-clojure

解决方法是 (numerator (clojure.lang.Numbers/toRatio (rationalize )))

0

评论者:alexmiller

我同意这个条目的意图,这里的这些应该可以正常工作。我不确定关于协议的方法,因为这将会是一个开放系统,我不确定这是我们想要的。另一种选择是只为 Numbers 创建 Java 方法,它们接受适当的类型,并让 JVM 来处理。

0

评论者:abrooks

对此有何进展? :)

0

评论者:alexmiller

坐在队伍里,等待爱情。

0

评论者:abrooks

我能给她爱吗?如果我们能达成一致的方向,我将很高兴创建补丁。

0

评论者:alexmiller

我已经处理了这里已有的补丁吗?

0

评论者:jafingerhut

在此补丁应用后,分子和分母的新版本会进行反射调用。这是预期的吗?

0

评论者:jafingerhut

创建了ticket CLJ-2408,使问题比已关闭ticket上的评论更为突出。

0

评论者:alexmiller

补丁已回滚

0
参考: https://clojure.atlassian.net/browse/CLJ-1435 (由 abrooks 报告)
...