2024 年 Clojure 状态调查! 分享您的想法。

欢迎!有关如何使用本网站的信息,请参阅 关于 页面。

+1
Java 互操作

这似乎可能是遗漏这些内容的错误。存在未检查的 divide-int 和 unchecked-remainder-int 函数,但没有对应于长整型的函数,尽管其他未检查操作都有对应的长整型函数。JVM 有长除法和取余的中间代码。

Clojure 文档中关于“Java 原始类型支持”的部分 pages https://clojure.org/java_interop 为 unchecked-divide 和 unchecked-remainder 提供了链接,但由于在 Clojure 中它们不存在,因此 API 链接的目标不存在。

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

9 个答案

0

评论由:coltnz 提供

试着解决这个问题。

0

评论由:coltnz 提供

  • 还添加了 unchecked-divide-int 和 unchecked-remainder-int 的测试。
  • 未检查的函数只支持二进制参数,如果它们是检查的,将会抛出 CompilerException(ArityException)。
  • 对于使用 Clojure 中的高性能代码从 Clojure 业务方面使用 Java 集合,(int,long) 和 (long,int) 覆盖有什么价值吗?
0

由:alexmiller 发表评论

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

1)当我应用补丁(git apply CLJ-1545.diff)时,出现了一堆空白错误,这需要清理,但补丁似乎在test/clojure/test_clojure/numbers.clj中的更改上完全不适用。看起来可能是差异文件的格式不正确。你可能需要查阅一下有关使用git format-patch的说明,请参阅http://dev.clojure.org/display/community/Developing Patches

2)如果您能提供一个更有用的git提交信息,那就更好了。例如:“CLJ-1545 添加了缺少的未检查除法和未检查余数对原始长整数。”

谢谢!

0
by

评论由:coltnz 提供

呀,对不起,Alex。

包含更好提交信息的新补丁。

0
by

由:alexmiller 发表评论

补丁格式看起来更好。根据我的理解,Clojure 已然会使用正确的字节码来处理已检查或未检查,因此可能根本不需要这个补丁?

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

(defnfoo-div ^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
by

评论者:jafingerhut

Alex,您在之前的评论中是否使用过**unchecked-math**为 true 或 false 进行测试?如果为false,那么如果 CLJ-1254 被认为是错误,那么您看到的行为也是一种遗漏了相同边际情况的错误。

0
by

由:alexmiller 发表评论

无论 unchecked-math 设置为何,当前的结果都相同,但我是这样想的。

回忆一下关于 {{(/ Long/MIN_VALUE -1)}} 的情况,我认为您是对的。新的未检查除法和余数应该与当前(已检查)形式起到相同的作用,而正常的除法和余数应该进行溢出检查。我认为 CLJ-1254 应该解决 quot 的更改。

0
by

评论由:coltnz 提供

用户=> (dotimes (循环: 6) (时间 (dotimes (循环: 50000000) (无符号除法 4 (System/currentTimeMillis))))))
"已过时间: 1806.942 毫秒"
"已过时间: 1808.747 毫秒"
"已过时间: 1865.074 毫秒"
"已过时间: 1802.777 毫秒"
"已过时间: 1839.468 毫秒"
"已过时间: 1830.61 毫秒"
nil
用户=> (dotimes (循环: 6) (时间 (dotimes (循环: 50000000) (除法 4 (System/currentTimeMillis))))))
"已过时间: 5003.598 毫秒"
"已过时间: 4998.182 毫秒"
"已过时间: 4941.237 毫秒"
"已过时间: 5036.517 毫秒"
"已过时间: 4965.867 毫秒"
"已过时间: 4982.693 毫秒"

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