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

欢迎!请参阅关于页面以了解更多此平台的信息。

+1
Java 交互

这似乎是一个疏忽,这些功能可能缺失。存在 unchecked-divide-int 和 unchecked-remainder-int 函数,但没有对长整型的等效函数,尽管其他未检查操作的长整型等效函数已经存在。JVM 有长除法和中取余的字节码。

Clojure 文档中“Java 原始类型支持”部分在https://clojure.org/java_interop中有未检查除法和未检查取余的链接,但由于它们在 Clojure 中不存在,因此 API 链接的目标不存在。

似乎最好是将这些添加到 Clojure 中,或者从文档中删除它们。

9 答案

0

评论人:coltnz

尝试解决这个问题。

0

评论人:coltnz

  • 还为 unchecked-divide-int 和 unchecked-remainder-int 添加了测试。
  • 未检查函数只支持二参数,当进行检查时将会抛出 CompilerException(ArityException) 异常。
  • 在 Clojure 中使用 Java 集合的高性能代码中,是否值得使用 (int,long) 和 (long,int) 的重载以提高 Java 交互性能?
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

评论人:coltnz

哎呀,对不起,Alex。

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

0

评论人:alexmiller

补丁格式看起来更好。深入到票据本身,据我所知,Clojure 已经会使用适当的字节数据来处理检查或不检查操作,因此这可能并不需要?

如果没有补丁编译(

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

的函数字节码为

`
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)}} 案例的记忆中,我认为你是对的。新的未检查除法和未检查余数应该做与当前(检查)形式相同的事情,而常规的除法和余数案例应该进行检查溢出。我认为 CLJ-1254 应该涵盖 quot 的更改。

0

评论人:coltnz

user=> (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
user=> (dotimes (link: 6) (time (dotimes (link: 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 报告)
...