簡體   English   中英

clojure.tools.namespace.repl / refresh無效

[英]clojure.tools.namespace.repl/refresh not working

我有這個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打破它?

顯然,在project.clj指定一個:main強制項目使用AOT來打破這個。

資料來源: http//dev.clojure.org/jira/browse/TNS-27

這不是你調用refresh ,而是你調用它時的方式。

refresh使用文件上的時間戳來查看何時需要重新加載它們。 這樣它只會重新加載它需要的東西。 因為在通過repl重新定義var之后沒有更改文件,所以它跳過加載該文件。

如果我從這樣的文件開始:

(ns bla.core)  
(def bar 3) 

然后第一次調用刷新:

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

我們可以看到它沒有重新加載任何名稱空間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM