我有这个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打破它?
答案 0 :(得分:1)
显然,在:main
中指定project.clj
会强制项目使用AOT来打破此问题。
答案 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
我们可以看到它没有重新加载任何命名空间。