Clojure 用无限循环编辑运行程序

Clojure 用无限循环编辑运行程序,clojure,Clojure,在这个()视频中,dude编辑正在运行的程序,该程序在循环中呈现opengl内容 当我运行此命令时: (def a 10) (defn myloop [] (while (= 1 1) (println a) (Thread/sleep 1000))) (myloop) 然后更改a的值,重新评估什么也不做,值似乎没有改变。我正在使用LightTableIDE。我是否应该切换到emacs?我知道这不是对你问题的直接回答-但是如果你想在Clojure中以这种方式

在这个()视频中,dude编辑正在运行的程序,该程序在循环中呈现
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
    ... ))