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
...