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?,这很容易造成混淆。

建议: 扩展 numerator 和 denominator,以便它们也能在整数类型(long,BigInt,BigInteger)上工作,通过将路由到Numbers上相应类型的方法。

补丁: clj-1435.patch

筛查: Alex Miller

Rich 筛查中的问题

  1. numerator 和 denominator 被标记为返回 java.math.BigInteger(而非 clojure.lang.BigInt),我的补丁也是按此执行的。但是,也许这应该是 BigInt 吧?我不确定做出这个决定的依据是什么。
  2. numerator 和 denominator 是否应接受 BigInteger 和 BigInt 都可以?

13 答案

0

评论由:jafingerhut

我不知道关于这个票证的官方立场,但我会添加一些注释。

Aaron,numerator 和 denominator 非常清楚地记录了只有 Ratio 类型才能使用。

很容易编写 my-numerator 和 my-denominator 来实现您希望的精确功能,检查 arg 的类型,对于 Ratio 类型使用 numerator 和 denominator,对于其他数值类型执行您认为正确的操作。

0

评论人为:abrooks

我清楚它们是以这种方式进行记载的。我观点的一部分是,你可能完全在使用比率类型,并且在它们之间的算术运算中,有时会意外地得到一个非比率数字。

也请考虑

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

然后你只能实现一个 try/catch 修正或者在使用 {{numerator}} 或 {{denominator}} 之前总是检查类型,这将导致性能损失。

我想到的补丁是创建一个协议,扩展到比率、大整数和 Long,调用适当的方法(比率)或对于整数类型返回给定数字或 1(分子/分母)。我预计这将维持当前的性能水平,在它工作的情况下,并在目前未处理的情况中表现正常。

0

评论人为:gfredericks

我确实已经多次编写了 Andy 描述的辅助函数。

0

评论人为:felipegalli

相关问题: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
by

评论人为:alexmiller

坐在队列中,等待爱情。

0
by

评论人为:abrooks

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

0
by

评论人为:alexmiller

我已经截图了这里已有的补丁吗?

0
by

评论由:jafingerhut

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

0
by

评论由:jafingerhut

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

0
by

评论人为:alexmiller

撤回补丁

0
by
...