clojure.tools.namespace.repl / refresh无法正常工作

时间:2015-08-27 19:28:04

标签: clojure

我有这个clojure文件:

(ns foo.core)

(def bar 1)

这个project.clj:

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

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

(def bar 1) 

(def bar 2)

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

2 个答案:

答案 0 :(得分:1)

显然,在:main中指定project.clj会强制项目使用AOT来打破此问题。

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

答案 1 :(得分:0)

这不是你调用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

我们可以看到它没有重新加载任何命名空间。