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,分子和分母的文档清楚地表明仅适用于Ratio类型。

编写my-numerator和my-denominator很容易,它们可以按照您希望的方式精确工作,检查arg的类型,并为Ratio类型使用分子、分母,对于其他数值类型执行您认为正确的操作。

0

评论者:abrooks

我知道它们是这样记录的。我想要表达的部分观点是,你可以在完全使用比值类型的同时进行,通过它们之间的算术运算,有时会意外地得到一个非比值数。

同时考虑

用户 -> (分子 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 报告)
...