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
by

评论者:

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

Aaron,分子和分母在文档中非常明显是只针对 Ratio 类型工作的。

很容易编写my-numerator和my-denominator,它们的工作方式正好符合您的期望,检查arg的类型,并使用numerator和denominator来处理 Ratio 类型,对于其他数值类型,则执行您认为正确的事情。

0

评论人:abrooks

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

另外考虑

user=> (numerator 2/1) 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

相关问题:[如何将任何数字转换为 Clojure.lang.Ratio 类型](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

评论者:

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

0

评论者:

创建了CLJ-2408票证,将问题突出显示为关闭票证上的一条评论。

0

评论人:alexmiller

补丁已撤销

0
参考: https://clojure.atlassian.net/browse/CLJ-1435(由 abrooks 报告)
...