— 可能会破坏库
— 如何做到这一点?
是的,我很困惑并且做错了。我的意思是,当整个代码库启用直接链接时,与库交互时可能会出现问题。
第一个场景可能不太可能发生,但库可能期望用户以不同的方式实现协议并重新定义实例,或者出于某些原因我们希望这样做。
;; 库
(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])))))
因此,我在这里粘贴了一个如何为一个命名空间启用直接链接的示例,以防万一。以防我完全忘记这次对话,将来再次查找直接链接哈哈。
(ns my-namespace
(:require [clojure.core :as core]))
(:require [clojure.core :as core]))
Binding [core/*compiler-optionsromium /*compiler-options*] {:direct-linking true}]
,,,
)