我有这个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
我们可以看到它没有重载任何名称空间