Printing 为什么使用';打印';在clojure中,只有在我使用println之后才会出现在我的控制台中?

Printing 为什么使用';打印';在clojure中,只有在我使用println之后才会出现在我的控制台中?,printing,clojure,Printing,Clojure,我在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)

我在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(struid):“@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
将其内容刷新到控制台。

输出在刷新之前实际上不会进入控制台。通常,打印换行符是控制台的默认信号控制台刷新输出。在大多数IO库中,您通常可以通过调用刷新函数在大多数语言中强制执行此操作。

根据,默认情况下,在每一行换行符上刷新输出。因此,您可能必须显式刷新输出以获得所需内容。

仔细查看
pr的Clojure源代码后intln
print
。区别在于
println
调用
prn
和print调用
pr
。在
prn
中调用
新行
。然后检查新行是否刷新,如果为真,则显式调用
flush
。因此调用
print
如果字符串中有任意数量的换行符(“\n”)不会刷新到输出流,则必须调用
换行符
,或直接调用
刷新

我实际上是使用
打印的(打印(str uid):“@o”\n”)
所以有一个新行,但我没有工作。@rileyfreeman你应该首先提到这一点。请相应地更新你的问题。