有没有办法在lein repl启动时将方法注入clojure.core?

时间:2013-12-18 09:28:47

标签: clojure

:injections关键字非常有用。但是,我希望在核心中动态安装一些函数以进行调试。怎么办呢?

    :injections [(require 'spyscope.core)
                 (use '[cemerick.pomegranate :only (add-dependencies)])
                 (use '[clojure.tools.namespace.repl :only (refresh)])]

理想情况下,我希望refresh留在我可以随处使用的地方

1 个答案:

答案 0 :(得分:4)

您可以将intern用于此目的,但我怀疑可能有更好的方法让调试功能始终可用。我曾经internclojure.core使用现有函数来学习东西,但是在其他命名空间中注入函数时感觉太过黑了。

(intern 'clojure.core 'refresh (fn [] (println "refreshed!"))
(ns another-ns)
(refresh)
;=> refreshed!

在您的project.clj中,您可以使用:repl-options密钥,特别是:init。但是,这取决于您所考虑的工作流程,因为该函数在REPL启动时已存在的所有命名空间中都不可用,因为它们都已refer编辑了clojure.core中的公共变量1}}。

然而,当REPL启动时,您可以调用(clojure.tools.namespace.repl/refresh)一次,以重新加载所有名称空间,然后该函数应该可用。我刚刚尝试了以下内容,似乎有效:

:repl-options {:init (do (require 'clojure.tools.namespace.repl)
                         (intern 'clojure.core 'refresh clojure.tools.namespace.repl/refresh)
                         (clojure.tools.namespace.repl/refresh))}