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

欢迎!请参阅关于页面以获取更多关于如何操作的信息。

0
Java Interop

因为比率的值会变成最简形式,并且对于最低形式是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.Long 无法转换为 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报告)
...