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

欢迎!请参阅 关于 页面以获取有关如何使用的更多信息。

0
编译器
已关闭

使用 core/proxy 为 Java 类生成代理产生生成的类文件中不可预测的方法顺序。
这对于可重复构建(在进行 AOT 时)来说是一个问题。

具体来说,我在 Docker 中运行 Clojure,并希望我的应用程序镜像层尽可能小(像 Java 开发者使用 Meta-inf 类路径和 lib 目录生成的那些一样)。无论如何,为了正确地使其工作,以便所有的依赖项(包括作为 AOT 部分编译的依赖项)都在单独的一层上,我需要在每次构建时都运行编译应用程序依赖代理的输出。这减少了构建时间、图像推送时间、图像拉取时间和容器调度时间。

展示问题的示例代码(您需要运行几次才能看到问题)。

https://github.com/kipz/predictable-proxies

原因:我发现问题在于这里使用了未排序的映射

https://github.com/clojure/clojure/blob/master/src/clj/clojure/core_proxy.clj#L186

方法:使用按键哈希排序的有序映射(键是方法名称、参数类型顺序和返回类型的向量)。

补丁:CLJ-1973-v5.patch

审核人: Alex Miller

在备注中关闭: 已发布在 1.11.0-beta1 中

10 个回答

0

评论者:kipz

使用 sorted-map 的补丁

0

评论由:alexmiller发表

我认为您可以参考 https://clojure.org/guides/comparators 上的建议,为这个补丁编写一个更简单的比较器。

0

评论者:kipz

如请求,写了一个更简单的比较器。

0

评论由:alexmiller发表

我认为你可能丢失了有序集合。

0

评论者:kipz

分支间的复制粘贴错误。这次已经测试。

0

评论者:kipz

现在有“let”更一致的格式化

0

评论由:alexmiller发表

虽然这可能是可行的,但最好使用Clojure的 وقت{{hash}} 函数而不是Java的{{.hashCode}} 函数。映射本身是基于{{hash}}进行哈希的,这看起来更合适。

0

评论者:kipz

如要求,使用Clojure的 باعث {{hash}}。

感谢Alex - 还学到了布尔比较器!

0

评论由:alexmiller发表

请注意,由于在这些版本之间没有保证哈希,所以这种顺序可能会在Clojure或JVM版本之间发生变化。目前先进行预筛选。

0
欢迎来到Clojure问答社区,您可以在此提问,并获得Clojure社区成员的解答。
...