请在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=>
`

不支持整数类型(如 int)上的分子和分母,这会使您在调用之前必须始终检查 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

我知道它们是这样记录的。我的观点的一部分是,你可能完全使用Ratio类型,并通过它们之间的算术运算,有时候意外中得到一个非Ratio数。

还要考虑

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](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

创建工单CLJ-2408以使问题比关闭的工单中的评论更加突出。

0

评论者:alexmiller

补丁回滚

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