Clojure 用无限循环编辑运行程序
在这个()视频中,dude编辑正在运行的程序,该程序在循环中呈现Clojure 用无限循环编辑运行程序,clojure,Clojure,在这个()视频中,dude编辑正在运行的程序,该程序在循环中呈现opengl内容 当我运行此命令时: (def a 10) (defn myloop [] (while (= 1 1) (println a) (Thread/sleep 1000))) (myloop) 然后更改a的值,重新评估什么也不做,值似乎没有改变。我正在使用LightTableIDE。我是否应该切换到emacs?我知道这不是对你问题的直接回答-但是如果你想在Clojure中以这种方式
opengl
内容
当我运行此命令时:
(def a 10)
(defn myloop
[]
(while (= 1 1)
(println a)
(Thread/sleep 1000)))
(myloop)
然后更改
a
的值,重新评估什么也不做,值似乎没有改变。我正在使用LightTable
IDE。我是否应该切换到emacs
?我知道这不是对你问题的直接回答-但是如果你想在Clojure中以这种方式改变状态,我认为使用其中一种结构进行状态操作(例如,一个atom)可能比重新计算def更为习惯
如果您可能需要多个线程,这一点尤其正确,如果您使用的是图形,那么情况很可能就是这样
(def a (atom 10))
(defn myloop []
(while (= 1 1)
(println @a)
(Thread/sleep 1000)))
(myloop)
(reset! a 9)
一种可能性是重新评估没有发生,因为它与正在运行的程序在同一个线程上完成。尝试在另一个线程中运行
myloop
,而不是使用(future(myloop))
而不是(myloop)
,然后在几次打印后重新运行def
您的a
,看看它是否发生了变化
请注意,(在当前Clojure版本中)每次遇到它们时都会取消引用,这允许这种动态行为,但不赞成在交互测试/实验/演示期间重新引用。见和
VAR这种行为的另一个后果是,解引用会影响性能关键紧循环的效率。在不需要动态行为的地方,您可能会看到以下习惯用法来首先捕获值(注意,在确定瓶颈之前,通常不应尝试预优化)
我不使用LightTable,但有一种可能性是重新评估不会发生,因为它与正在运行的程序在同一线程上完成。尝试在另一个线程中运行
myloop
,而不是使用(future(myloop))
而不是(myloop)
,然后在打印几次后重新运行def
您的a
,看看它是否发生了变化。谢谢,这解决了我的问题!请创建一个答案,这样我就可以接受它
(def foo 42)
(let [foo foo] ; capture value of foo within scope of let
(loop ...
; do something with value of foo captured before entering loop
... ))