请在 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 类型使用 numerator,denominator,对于其他数值类型执行您认为正确的操作。

0 投票

评论人:abrooks

我知道它们是这样的文档。我的观点之一是,你可以在完全使用比值类型的情况下工作,通过它们之间的算术运算,有时意外地得到一个非比值数。

再考虑一下

用户=> (分子 2/1) ClassCastException java.lang.Long不能从clojure.lang.Ratio转换 clojure.core/numerator (core.clj:3238)

这时,你只能实现try/catch修正或者在用过{{numerator}}或{{denominator}}之前总是检查类型,这会降低性能。

我心中所想的补丁是创建一个协议,扩展到比值、大整数和长整数,它将调用适当的方法(比值)或者对于整数类型返回给出的数字或1(分子/分母)。我期望这能够维持目前的工作性能,并在当前尚未处理的情况中表现正常。

0 投票

评论人:gfredericks

我肯定已经多次编写了Andy描述的辅助函数。

0 投票
0 投票

评论人:alexmiller

我与该票据中意图一致,这些应该起作用。我不确定协议方法是否为开放系统,我不确定我们是否想要这样的系统。另一种选择是为Numbers创建Java方法,这些方法接受适当的类型并让JVM来解决。

0 投票

评论人:abrooks

这个问题有什么进展吗?:)

0 投票

评论人:alexmiller

坐在队伍中,等待爱情。

0 投票

评论人:abrooks

我能给它爱吗?如果我们能达成一致的方向,我很乐意创建补丁。

0 投票

评论人:alexmiller

我已经审查了这里已有的补丁吗?

0 投票

评论者:jafingerhut

应用此补丁后,分子和分母的新版本执行了反射调用。这是预期之中的吗?

0 投票

评论者:jafingerhut

创建了工单CLJ-2408,使问题比关闭的工单上的评论更为显眼。

0 投票

评论人:alexmiller

已回滚补丁

0 投票
...