以下示例显示,协议方法似乎没有直接链接。
$ clj -J-Dclojure.compiler.direct-linking=true
Clojure 1.10.1
user=> (defprotocol Foo (pfoo [this]))
Foo
user=> (defn libfn [x] (pfoo x))
#'user/libfn
user=> (extend-protocol Foo String (pfoo [_] :dude))
nil
user=> (libfn "hello")
:dude
user=> (alter-var-root #'user/pfoo (fn [old] (fn [this] (prn :this) (old this))))
#object[user$eval178$fn__179$fn__180 0x18eec010 "user$eval178$fn__179$fn__180@18eec010"]
user=> (libfn "hello")
:this
:dude
我这么问是因为我正在尝试找到一种通用的方法来修复协议方法以在sci + graal native-image中工作。限制条件如下
- 在直接链接下工作(对于原生图像使用非常重要)
- 与第三方库一起使用
- 避免对目标协议进行源代码更改(不能添加 ^:dynamic, ^:redef 元数据)
我有一个解决方案可以在这里使用,但它依赖于协议var可以在编译时通过alter-var-root进行更改,即使在直接链接下。这是一个安全的假设吗?