【发布时间】:2014-01-16 18:20:57
【问题描述】:
现在,我需要在 clojure/java 混合系统中重新加载某种代码。
我知道 tools.namespace lib 可以用来刷新 clj 代码。但是当我尝试重新加载线程中使用的代码时,它没有更新。
这是我需要更新的示例 clojure 代码:(只需在大写和小写之间切换。)
(ns com.test.test-util)
(defn get-word [sentence]
(let [a-word (rand-nth (clojure.string/split sentence #"\s"))
;;a-word (clojure.string/upper-case a-word)
]
(println a-word)
a-word))
我用future启动了一个线程,调用了上面的代码。
在 main 方法中,在我的第一个测试中,我只是创建了一个 future 并在一段时间后刷新代码。但它没有更新。所以,我还测试了刷新后创建另一个线程。但是代码没有更新。
(defn start-job []
(future (
(println "start worker job.")
(while @job-cond
(do (get-word (rand-nth sentences))
(Thread/sleep 2000)) )
(println "return!")
)))
(defn -main []
(let [work-job (start-job)]
(println "modify clj file...")
(Thread/sleep 10000)
(swap! job-cond not)
(future-cancel work-job)
(swap! job-cond not)
(refresh)
(Thread/sleep 3000)
(let [new-work-job (start-job)]
(Thread/sleep 10000)
(swap! job-cond not)
(future-cancel new-work-job))))
谢谢。
【问题讨论】:
-
您有多余的括号,保证会在 start-job 定义中导致 NPE。不带引号的括号不会对 clojure 中的代码块进行分组,它们会调用函数或宏调用。 Future 有一个隐式 do 块,因此您不需要将代码块包装在 future 中。 while 块中的 do 也是不需要的,因为 while 也有一个隐式 do。