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