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