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),通过将路由到为所需类型重载的 Number 方法。

补丁: 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 类型使用 numerator,denominator,对于其他数值类型做您认为正确的事情。

0

评论者:abrooks

我清楚这些已经记录在内。我的观点是,你可以完全使用比率类型进行操作,通过它们之间的算术运算,有时意外地得到了非比率数。

还需要考虑

user=> (numerator (clojure.lang.Ratio. 2/1)) java.lang.ClassCastException: clojure.lang.Ratio cannot be cast to 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
...