gpt4 book ai didi

grails - Clojure 1.2.1/1.3/1.4 '在 Grails 2.0.0 运行时生成的代理失败。 1.2.0就可以了

转载 作者:行者123 更新时间:2023-12-02 10:34:46 24 4
gpt4 key购买 nike

我正在努力扩展 Grails Clojure pluginGrails 2.0.0 (和 2.1.0-SNAPSHOT),我想将其更新为 Clojure 1.3.0并添加clojure.tools.logging

Clojure 在编译过程中抛出异常clojure.tools.logging 日志流函数中 ByteArrayOutputStream代理:

ClassCastException:clojure.asm.Type 无法转换为 clojure.lang.IFn

( https://gist.github.com/a6ae681c37091a3d2379 )

我删除了 clojure.tools.logging 并编写了 Object 的精简代理:

(代理[java.lang.Object][](toString[]“代理的toString”))

它还引发了相同的 ClassCastException 和消息。

我尝试打印代理macroexpand-1并得到同样的结果。

我恢复到 Clojure 1.2.0,代理再次正常工作。

我尝试了 1.4.0 的多个版本,它们表现出与 1.3.0 相同的行为。1.2.1 也会引发某种异常,但我正在尝试使用 1.3.0,所以我没有花太多时间。

堆栈跟踪指向 core_proxy.cljgenerate-proxylet 形式之一定义的“gen-method”函数。

我在周围添加了一小部分println,看看我是否能捕捉到正在发生的事情。也许下一条语句会对我的读者产生巨大的误解,但简单地添加这些 println 就会以一种我完全没有预料到的方式改变编译时行为。尽管 mvn package 中的所有 Clojure 测试都继续通过,但异常位置和异常类型完全改变了。

例如,在 gen-method 开始生成字节码之前添加一个 println 会导致 Clojure 抛出

ClassCastException:clojure.lang.PersistentArrayMap 无法转换为 java.lang.Class

( https://gist.github.com/5a7a40929a6c4a104bd5 )

我还看到过各种其他错误,具体取决于我放置 println 的位置,但这是最常见的。

显然,Grails 和 Clojure 的某些方面在这里没有正确啮合,但我没有看到其中的联系。起初我怀疑 ASM 不兼容,但由于 Clojure 有自己的 ASM 命名空间,所以我看不出这是问题所在。但也许我错了,我已经盯着 clojure.lang.Compilerproxygenerate-proxy 好几天了,现在试图让它发挥作用,我几乎停止了前进,因为我已经失去了动力:(

对于缺少链接,我深表歉意。您可以从下面复制并粘贴:

Grails Clojure - github.com/grails-plugins/grails-clojure

Clojure 工具日志记录 - github.com/clojure/tools.logging/blob/master/src/main/clojure/clojure/tools/logging.clj第133行是'代理

最佳答案

我发现了一个名为 CLJ-944 的问题上clojure.org 。在那里您可以找到 ClassCastException: clojure.lang.PersistentArrayMap cannot be cast to java.lang.Class 的修复程序问题

问题是:

that the compiler injects an incorrect cast to clojure.lang.PersistentHashMap. In this case it should probably be cast to a clojure.lang.Associative, the highest common interface having the .containsKey method.

补丁 1 - 0001-Fix-for-CLJ-944.patch

补丁 2 - 0002-Fix-for-CLJ-944.patch

希望对您有所帮助。

关于grails - Clojure 1.2.1/1.3/1.4 '在 Grails 2.0.0 运行时生成的代理失败。 1.2.0就可以了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9101969/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com