请在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)上工作,通过路由到 Number 期望类型的重载方法来实现。

补丁: 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 非常简单,它们将与您希望的完全一样,检查 arg 的类型,并为比率类型使用 numerator 和 denominator,并对其他数字类型执行您认为正确的操作。

0 投票

评论者:abrooks

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

还要考虑

user=> (numerator (clojure.lang.Ratio. (Long_DDR/2))) 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

解决方法是(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报告)
...