请在 2024 年 Clojure 状态调查! 中分享您的想法。

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

0
Clojure
反射不会在 JVM 调用之间返回相同的方法顺序(通过 Class::getMethods)。这最明显地体现在将 Clojure 函数(它们是 Callable 和 Runnable)提交给执行器时。


(ns repro)

;;(set! *warn-on-reflection* true)

(defn repro
  []
  (let [exec (java.util.concurrent.ForkJoinPool/commonPool)
        work #(do 1)]
    (deref (.submit ^Object exec work))))  ;; 故意使用反射

(defn -main []
   ;; dereffing a runnable returns nil, a callable can return a value, in this case an integer
  (System/exit (or (repro) 0)))



nondeterministic ➜ while true; do clojure -m repro; echo $?; done
0
0
0
1
0
0
0
1
0
0
0

5 个答案

0

评论由:gshayban 提供

附加了一个排序已见方法的补丁

0

评论由:gshayban 提供

关于补丁:比较器的第一次遍历(检查参数数)可以消失:只有具有相同参数数的方法会被比较。这听起来对吗?

0

评论由:bronsa 提供

是的,这听起来是对的。

0

评论由:gshayban 提供

使用更简约的比较器的补丁

0
参考:[链接](https://clojure.atlassian.net/browse/CLJ-2413)(由 gshayban 提报)
...