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),通过将路由到为所需类型重载的数字方法来实现。

补丁: 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 非常简单,它们可以按照您的期望精确工作,检查参数类型,并对比率类型使用分子和分母,对其他数值类型进行适当的处理。

0

评论者:abrooks

我知道它们已经这样记录。我的观点的一部分是,您可能完全使用比率类型,并通过它们之间的算术运算,有时会意外地得到非比率数值。

也请考虑

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

然后您只剩下两个选择:实现 try/catch 校正或者在使用 {{numerator}} 或 {{denominator}} 之前总是检查类型,这会导致性能损失。

我心中的补丁是在 Ratio、BigInt 和 Long 上扩展协议,调用相应的方法(比率),对于整数类型返回给定数字或 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

创建了工单CLJ-2408,使问题比闭票中的评论更为突出。

0

评论者:alexmiller

已撤销补丁

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