Clojure.tools.namespace.repl /refresh不起作用



我有这个clojure文件:

(ns foo.core)
(def bar 1)

和这个项目。clj:

(defproject foo "version"
  :dependencies [[org.clojure/clojure "1.6.0"]]
  :main foo.core)

我打开一个终端并运行leinrepl。然后我改变bar OUTSIDE的值。

(def bar 1) 

(def bar 2)

我在编辑器上更改了这个值,并且不要忘记保存文件。然后我在repl中运行命令(load-string "(clojure.tools. namspace .repl/refresh)")我在回复中输入bar,仍然得到1而不是2。然而,如果你只是运行(clojure.tools. namspace .repl/refresh),然后查询bar的值,你会得到2。为什么会这样呢?为什么函数load-string会破坏它?

显然,在你的project.clj中指定一个:main会强制项目使用AOT,这会打破这个规则。

来源:http://dev.clojure.org/jira/browse/TNS-27

这不是你如何调用refresh,这是当你调用它。

refresh使用文件上的时间戳来查看何时需要重新加载它们。这样它只会重新加载它需要的东西。因为在通过repl重新定义var后没有更改文件,所以它跳过了加载该文件。

如果我从这样的文件开始:

(ns bla.core)  
(def bar 3) 

然后第一次调用refresh:

bla.core> (load-string"(clojure.tools.namespace.repl/refresh)")
:reloading (bla.core bla.core-test)
:ok

然后在repl中重新定义bar:

bla.core> (def bar :changed-from-repl)                                             
#'bla.core/bar

和刷新:

bla.core> (load-string "(clojure.tools.namespace.repl/refresh)")
:reloading ()
:ok

我们可以看到它没有重载任何名称空间

最新更新