2024 年 Clojure 现状调查中分享您的想法!

欢迎!请查看关于页面了解如何使用本站的一些更多详情。

+1
Java 互操作

这看起来像是遗漏,这些应该存在。存在 unchecked-divide-int 和 unchecked-remainder-int 函数,但没有 long 类型的等价函数,尽管其他未检查的操作都有 long 类型的等价函数。JVM 中有长除法和取余的字节码。

Clojure 文档在《支持 Java 原始数据类型》部分的页面 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)。
  • 对于 Java 互操作案例(例如,在性能代码中使用 Clojure 从 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 添加了原始 long 的缺失 unchecked-divide 和 unchecked-remainder”。

谢谢!

0

由 coltnz 发表的评论:

哦,对不起,Alex。

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

0

由 alexmiller 发表的评论:

补丁格式看起来更好。进一步到票证的本身,据我所知,Clojure 已经会使用正确的 bytecode 来处理检查或非检查,所以这甚至可能并不是必要的?

如果我不带补丁编译

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

那么这个 fn 的 bytecode 就是

`
public final long invokePrim(long, long);

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

`

同样,两个 long 的 quot 会产生相同的代码,但使用 lrem。我认为补丁对生成的 bytecode 没有净效果?

0

评论者:jafingerhut

Alex,你在先前的评论中是否用 **unchecked-math** 真或假进行了测试?如果是假的,那么如果 CLJ-1254 被认为是bug,那么你看到的也是同样的bug,它忽略了相同的边缘情况。

0

由 alexmiller 发表的评论:

当前的结果与 unchecked-math 的设置无关,但我看到了你的观点。

刷新我对 {{(/ Long/MIN_VALUE -1)}} 的情况的记忆,我认为你是正确的。新的 unchecked-divide / remainder 应该做当前(检查)形式的同样的事情,而正常的除法和余数情况应该进行溢出检查。我认为 CLJ-1254 应该涵盖 quot 的更改。

0

由 coltnz 发表的评论:

用户=> (dotimes (link: 6) (time (dotimes (link: 50000000) (unchecked-divide 4 (System/currentTimeMillis))))))
"已过时间:1806.942 毫秒"
"已过时间:1808.747 毫秒"
"已过时间:1865.074 毫秒"
"已过时间:1802.777 毫秒"
"已过时间:1839.468 毫秒"
"已过时间:1830.61 毫秒"
nil
用户=> (dotimes (link: 6) (time (dotimes (link: 50000000) (/ 4 (System/currentTimeMillis))))))
"已过时间:5003.598 毫秒"
"已过时间:4998.182 毫秒"
"已过时间:4941.237 毫秒"
"已过时间:5036.517 毫秒"
"已过时间:4965.867 毫秒"
"已过时间:4982.693 毫秒"

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