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

zca*_*ate 4 clojure

:injections关键字非常有用。但是,我希望为调试目的在内核中动态安装几个功能。如何才能做到这一点?

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

理想情况下,我会希望refresh可以随处使用

jua*_*rro 5

您可以intern为此目的使用,尽管我怀疑可能会有更好的方法来始终提供调试功能。我用internclojure.core时代,我想更动现有的功能来学习的东西,但在其他的命名空间注入功能感觉太hackish的。

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

而且project.clj您可以使用:repl-options钥匙,特别是:init。不过,这取决于您所考虑的工作流程,因为在REPL启动时,该功能将无法在所有已存在的命名空间中使用,因为它们都已经在中refer编辑了公共变量clojure.core

但是,您可以(clojure.tools.namespace.repl/refresh)在REPL启动时调用一次,以重新加载所有名称空间,然后从那时起该功能应该可用。我只是尝试了以下方法,它似乎可以工作:

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