请分享您的想法,参加2024 年 Clojure 状态调查!

欢迎!请参阅关于页面以了解有关此工作的更多信息。

0
Java 互操作

因为比例值会简化为最简形式,并且在最低形式为 N/1 的整数值中,会自动转换为大整数(以前是 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,使它们能够像您希望的那样工作,检查参数的类型,对于 Ratio 类型使用 numerator、denominator,对于其他数字类型做任何您认为正确的事。

0

评论由:abrooks 发布

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

另外考虑

user=> (numerator (Long. (/ 2 1))) 类型转换异常:不能将 java.lang.Long 实例转换为 clojure.lang.Ratio (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 报告)
...