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

欢迎!请参阅关于页面以获取更多有关此工作方式的信息。

+1
Java 交互

这似乎是一个疏忽,这些函数丢失了。存在 unchecked-divide-int 和 unchecked-remainder-int 函数,但没有 longs 的等效函数,尽管每个未被检查的操作都对 longs 有等效函数。JVM 有长除法和余数的字节码。

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

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

9 答案

0
by

评论者:coltnz

尝试解决这个问题。

0
by

评论者:coltnz

  • 还为 unchecked-divide-int 和 unchecked-remainder-int 添加了测试。
  • 未检查的函数仅支持二元参数长度,并且会在检查的情况下不会引发 CompilerException(ArityException)的地方引发 ArityException。
  • 对于使用 Java 集合的 Clojure 高性能代码,是否有值 (int,long) (long,int) 覆盖?
0
by

评论文本由: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 添加了 primitive longs 的 missing unchecked-divide 和 unchecked-remainder。”

谢谢!

0

评论者:coltnz

哎,对不起,Alex。

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

0

评论文本由:alexmiller 提供

补丁格式看起来更好。从更远的距离来看这个票,afaict Clojure 将已经使用正确的 byteocode 来实现 checked 或 unchecked,所以这甚至可能不是必须的?

如果我不使用补丁进行编译(

(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

`

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

0

评论文本由:jafingerhut 提供

Alex,你在之前的评论中测试时 unchecked-math 设置为 true 还是 false?如果为 false,那么我认为如果 CLJ-1254 被判断为错误,那么你看到的行为也是一个错误,它错过了相同的边缘情况。

0

评论文本由:alexmiller 提供

不管 unchecked-math 的设置如何,结果都是相同的,但我看到你的观点。

想起 {{(/ Long/MIN_VALUE -1)}} 的情况,我认为你是对的。新的 unchecked-divide / remainder 应该与当前(checked)形式的作用相同,并且常规除法和余数情况应该执行溢出检查。我认为 CLJ-1254 应该涵盖 quot 的变化。

0

评论者:coltnz

user=> (dotimes (link: 6) (time (dotimes (link: 50000000) (unchecked-divide 4 (System/currentTimeMillis)))))
"Elapsed time: 1806.942 msecs"
"Elapsed time: 1808.747 msecs"
"Elapsed time: 1865.074 msecs"
"Elapsed time: 1802.777 msecs"
"Elapsed time: 1839.468 msecs"
"Elapsed time: 1830.61 msecs"
nil
user=> (dotimes (link: 6) (time (dotimes (link: 50000000) (/ 4 (System/currentTimeMillis)))))
"Elapsed time: 5003.598 msecs"
"Elapsed time: 4998.182 msecs"
"Elapsed time: 4941.237 msecs"
"Elapsed time: 5036.517 msecs"
"Elapsed time: 4965.867 msecs"
"Elapsed time: 4982.693 msecs"

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