2024 年 Clojure 状态调查! 中分享您的观点。

欢迎!请参阅 关于 页面以获取更多有关此内容的信息。

+1
Java 互操作

这似乎是一个疏忽,因为没有提供这些功能。存在 unchecked-divide-int 和 unchecked-remainder-int 函数,但没有提供对于长整型的等效函数,尽管对于每个其他未检查的操作都有长整型的等效函数。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) 异常。
  • 例如,在使用 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 添加了原始长整型的 missing 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 / remainder应该像当前(检查)形式一样工作,而常规的除法和余数案例应该进行溢出检查。我认为CLJ-1254应该涵盖quot的变化。

0

评论者:coltnz

user=> (dotimes (勾选: 6) (时间 (dotimes (勾选: 50000000) (unchecked-divide 4 (System/currentTimeMillis)))))
"耗时:1806.942 毫秒"
"耗时:1808.747 毫秒"
"耗时:1865.074 毫秒"
"耗时:1802.777 毫秒"
"耗时:1839.468 毫秒"
"耗时:1830.61 毫秒"
nil
user=> (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报告)
...