我在Clojure中有以下代码:
(do
(println "starting....")
(sig! a 0)
(sig! b 0)
(future
(Thread/sleep 4000)
(println "switch 1")
(sig! a 1)
(sig! b 0)
(Thread/sleep 4000)
(println "switch 2")
(sig! a 0)
(sig! b 1)
(Thread/sleep 4000)
(println "switch 3")
(sig! a 1)
(sig! b 1)) nil))
我有一些监视器,它们监听原子a、b、s和c1的变化,并在变化时打印一些字符串。使用
(print (str uid ":" @o "\n")
或println版本。Clojure文档说print
和println
应该表现完全相同,除了println
中的换行符,但是我没有看到这一点。
当监视器使用println
时,我立即看到字符串。当监视器使用print
时,只有在下一个println
被调用时才会看到输出。下面是使用println
和使用print
的输出结果。
使用print
时,我只能看到最后一个println
之前的值。starting....
switch 1
a:1
s:1
switch 2
a:0
b:1
s:0
s:1
switch 3
现在有println了。
starting....
switch 1
a:1
s:1
switch 2
a:0
b:1
s:0
s:1
switch 3
a:1
s:0
c1:1
正如您所看到的,这里打印出了观察者捕获到的变化。我使用的是Clojure 1.5版本。似乎print
需要使用println
才能将其内容刷新到控制台。
(print (str uid ":" @o "\n")
打印输出,虽然应该会有一个新行,但实际上并没有起作用。 - rileyfreeman