— 可以破坏库
— 怎么做?
是的,我有点困惑,弄错了。我的意思是,当整个代码库启用直接链接时,与库交互时可能会有问题。
第一种情况可能不太可能发生,但库可能期望用户以不同的方式实现协议并重新定义一个实例,或者我们可能出于某种原因想要这样做。
;; 图书馆
(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}])
,,,
)