— 可以破坏库
— 怎么做到的?
是的,我很困惑,弄错了。我的意思是,当我们与库交互且整个代码库启用了直接链接时,可能会有问题。
第一种情况可能不太可能,但库可能期望用户以不同的方式实现协议并重新定义实例,或者我们出于某种原因想这样做。
;; 库
(defprotocol MyProtocol
(my-function [this]))
(def my-instance (reify MyProtocol
(my-function [this] (println "hello"))))
;; 应用程序
;; 我们不能重新定义 my-instance
;; 我们也不能把它设置为 ^:redef,它在库中
第二种情况是我们正在编写库时忘记将变量标记为 ^:redef,应用程序将看不到其中的更改。
;; 库
(def my-var 10)
;; 我们后来尝试更新这个变量,在编译之后
;; 应用程序
(defn use-var []
(println my-var))
以上两个例子可能都是人为构造的,我没有具体的问题要问,但直接链接在这里只有简短的说明,并没有解释如何进行细粒度处理,这就是为什么我会提出这个问题。
Andray Shotkin检查了,显然这是有效的,代码确实没有使用变量进行直接链接。
(binding [*compiler-options* {:direct-linking false}])
(clj-java-decompiler.core/decompile (fn []
(seq (map :x [1 2 3])))))
(binding [*compiler-options* {:direct-linking true}])
(clj-java-decompiler.core/decompile (fn []
(seq (map :x [1 2 3])))))
因此,我在此粘贴了一个启用命名空间直接链接的示例,以供参考。以防我完全忘记了这次对话,以后再次查找直接链接的答案 hahaha。
(ns my-namespace
(:require [clojure.core :as core]))
(binding [core/*compiler-options*
{:direct-linking true}])
,,,
)