2024 Clojure 状态调查中分享你的想法!

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

+1
Java Interop

这似乎是一个疏忽,这些方法缺失。存在unchecked-divide-int和unchecked-remainder-int函数,但long类型的等价函数缺失,尽管其他未检查操作都有long类型的等价函数。JVM有长除法和取余的字节码。

Clojure文档在页面https://clojure.org/java_interop的"对Java原始数据类型的支持"部分的链接,提供了unchecked-divide和unchecked-remainder的链接,但由于Clojure中没有这些函数,因此API链接的目标不存在。

在Clojure中添加这些函数或从文档中删除它们似乎是个好主意。

9 个答案

0

评论由:coltnz 提出

尝试解决这个问题。

0

评论由:coltnz 提出

  • 也为unchecked-divide-int和unchecked-remainder-int添加了测试。
  • 未检查的函数仅支持二进制参数,当检查模式下不会抛出CompilerException(ArityException)时,将会抛出。
  • 对于如从Clojure中使用Java集合进行高效率编码等Java互操作案例,(int,long)和(long,int)的重载有什么价值吗?
0

评论由:alexmiller 提出

感谢你承担这个任务,Colin!

1) 当我应用补丁(git apply CLJ-1545.diff)时,出现了一堆空白错误需要清理,而且补丁似乎也无法应用到test/clojure/test_clojure/numbers.clj中的更改。看起来可能是diff格式不正确。你可能想查看有关使用git format-patch的说明,请参阅http://dev.clojure.org/display/community/Developing Patches

2) 如果您能提供一个更有用的git提交信息,那将很有帮助。例如:"CLJ-1545 为原生长整型添加了不检查的除法(unchecked-divide)和不检查的余数(unchecked-remainder)。"

感谢!

0

评论由:coltnz 提出

哎,对不起,Alex。

带有更好提交信息的新的补丁。

0

评论由:alexmiller 提出

补丁格式看起来更好。根据我所见,Clojure 本来就会使用正确的字节码来处理检查或非检查,所以这可能并非必需?

如果我不使用补丁(编译)

(defn foo-div ^long [^long a ^long b] (quot a b))

那么这个fn的字节码为

`
public final long invokePrim(long, long);

Code:
   0: lload_1
   1: lload_3
   2: ldiv
   3: lreturn

`

类似地,两个长整型的quot产生的代码相同,但使用lrem。我认为补丁对生成的字节码没有净效应?

0

评论者:jafingerhut

Alex,您在之前的评论中用**unchecked-math**的true或false进行测试了吗?如果为false,那么我认为如果CLJ-1254被认为是错误,那么您看到的也应该被视为错误,同样地,它遗漏了相同的边缘情况。

0

评论由:alexmiller 提出

无论是unchecked-math设置与否,当前的结果都是相同的,但我看到了您的观点。

回忆一下关于{{(/ Long/MIN_VALUE -1)}}的情况,我认为您是对的。新的未检查除法(unchecked-divide)/余数应该做和当前检查形式一样的事,而正常的除法和余数情况应该进行溢出检查。我认为CLJ-1254应该涵盖quot的变化。

0

评论由:coltnz 提出

user=>
"已过时间: 1806.942 毫秒"
"已过时间: 1808.747 毫秒"
"已过时间: 1865.074 毫秒"
"已过时间: 1802.777 毫秒"
"已过时间: 1839.468 毫秒"
"已过时间: 1830.61 毫秒"
nil
user=>
"已过时间: 5003.598 毫秒"
"已过时间: 4998.182 毫秒"
"已过时间: 4941.237 毫秒"
"已过时间: 5036.517 毫秒"
"已过时间: 4965.867 毫秒"
"已过时间: 4982.693 毫秒"

0
参考:https://clojure.atlassian.net/browse/CLJ-1545 (报告人 jafingerhut)
...