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

我知道它们被这样文档化了。我的部分观点是,在完全使用比例类型的工作中,通过它们之间的算术运算,有时会意外地得到非比例类型。

此外请考虑

user=> (numerator (2/1)) 抛出异常:java.lang.Long 无法转换为 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报告)
...