— 可以断开库的连接
— 如何做到这一点?
是的,我很混淆,做得也不对。我的意思是,当整个代码库启用了直接链接时,与库交互时可能会出现问题。
第一种情况可能是unlikely,但是库可能会期望用户以不同的方式实现协议并重新定义实例,或者我们可能出于某些原因想要这样做。
;; 库
(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]))
(:binding [core/*compiler-options*
{:direct-linking true}]
,,,
)