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