请分享您的想法参加2024 Clojure 状态调查!

欢迎!请查看关于页面以了解更多关于该功能的信息。

0
协议

当一个加载包含 defprotocol 的命名空间时,clojure.core/proxy 无法使用。

例如,以下文件不能重新加载而不触发错误:

`

(ns foo.baz)

(defprotocol Hello
(hello [this]))

(def hello-proxy
(proxy [foo.baz.Hello] []

(hello []
  (println "hello world"))))

(hello hello-proxy)
`

将以上保存为 foo/baz.clj,我得到了以下错误

$ rlwrap java -cp target/clojure-1.8.0-master-SNAPSHOT.jar:. clojure.main Clojure 1.8.0-master-SNAPSHOT user=> (require 'foo.baz :reload) hello world nil user=> (require 'foo.baz :reload) CompilerException java.lang.IllegalArgumentException: No implementation of method: :hello of protocol: #'foo.baz/Hello found for class: foo.baz.proxy$java.lang.Object$Hello$6f95b989, compiling:(foo/baz.clj:11:1)

我正在使用当前的 git master (提交 5cfe5111ccb5afec4f9c73),但 clojure 1.7 也有相同的问题。

问题在于 proxy-name 仅使用接口名称作为键。这些名称在重新加载命名空间时不会改变,但接口本身是新的。

我将附加一个修复该问题的补丁。

2 答案

0

评论由:schmir 提出

我不确定这与 AOT 编译如何交互。

0
参考:https://clojure.atlassian.net/browse/CLJ-1864(由 schmir 提出)
...