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

欢迎!请参阅 关于 页面以了解更多关于这个工作方式的信息。

+1 投票
Java 互操作

这看起来可能是一个疏忽,这些缺失了。有 unchecked-divide-int 和 unchecked-remainder-int 函数,但 longs 没有等效的函数,尽管其他未检查操作都有 longs 的等效函数。JVM 有 long 除法和余数的字节码。

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 的测试。
  • 未检查的函数仅支持二进制arity,并且将抛出 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 为原始长整型添加了缺失的 unchecked-divide 和 unchecked-remainder。"

谢谢!

0 投票

由 coltnz 提出的评论

呜呼,抱歉,Alex。

附带更佳提交消息的新补丁。

0 投票

评论者:alexmiller

补丁格式看起来更好。根据我所知,Clojure 已经将会使用正确的字节码来处理 checked 或 unchecked,所以这可能根本不需要。

如果没有应用补丁进行编译

(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

`

类似地,两个长整型相除的 quotient 的字节码与 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报告)
...