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,分子和分母很明显是文档化的,仅在工作在比率类型上。

编写 my-numerator 和 my-denominator 很容易,这样它们可以精确地按照您的要求工作,检查参数类型,对于比率类型使用 numerator 和 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,调用合适的方法(_ratio)或者对于整数类型返回提供的数字或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](https://clojure.atlassian.net/browse/CLJ-1435)(由abrooks报告)
...