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?。

建议: 扩展 numerator 和 denominator,使其也能在整数类型(long, BigInt, BigInteger)上工作,通过路由到 Numbers 的重载方法来实现所需类型。

补丁: clj-1435.patch

审阅者: Alex Miller

为 Rich 审阅的提问

  1. numerator 和 denominator 标记为返回 java.math.BigInteger(而不是 clojure.lang.BigInt),并且我在补丁中遵循了这一点。看起来可能应该是 BigInt 吧?不确定如何做出这个决定。
  2. numerator 和 denominator 是否应该接受 BigInteger 和 BigInt 都可以?

13 答案

0

评论者:jafingerhut

我不知道关于这个票据的官方立场,但会添加一些备注。

Aaron,numerator 和 denominator 明确记录为仅适用于 Ratio 类型。

编写 my-numerator 和 my-denominator 非常简单,这样它们就像你希望的那样工作,检查 arg 类型,并在 Ratio 类型上使用 numerator、denominator,对于其他数值类型则做你认为正确的事情。

0

评论者:abrooks

我明白它们是这样的文档。我的一部分观点是你可以用比例类型完全工作,通过它们之间的算术运算,有时会意外地得到一个非比例的数字。

还需要考虑

user=> (numerator (Long/2)) java.lang.ClassCastException: java.lang.Long cannot be cast to 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
参考:[CLJ-1435](https://clojure.atlassian.net/browse/CLJ-1435)(由abrooks报告)
...