为什么在使用println后,在clojure中使用'print'打印的字符串只出现在我的控制台中?

ril*_*man 4 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)
      (sig! b 1)
      (Thread/sleep 4000)
      (println "switch 3")
      (sig! a 1)
      (sig! b 1)) nil))
Run Code Online (Sandbox Code Playgroud)

我有一些观察者听取原子a,b,s和c1并在它们改变时打印出一些字符串.使用(print (str uid ":" @o "\n")或println版本.clojure文档说print并且println应该表现完全相同的方式,除了换行符println,但我没有看到这一点.观察者使用时,println我立刻看到了弦乐.当观察者使用时print.我只看到下一个println被调用时的输出.下面我有printlnvs 的输出print.随着print我只看到了最后的值println.

starting....
switch 1
a:1
s:1
switch 2
a:0
b:1
s:0
s:1
switch 3 
Run Code Online (Sandbox Code Playgroud)

现在有了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
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,在这种情况下会打印观察者所选择的更改.我正在使用clojure 1.5.它似乎print需要println将其内容刷新到控制台.

ril*_*man 5

在Clojure的来源更加紧密地寻找后代码printlnprint.不同的是println呼叫prn和打印电话pr.在prn函数 newline被调用.然后它检查flush-on-new-line,如果为true则显式调用flush.因此print,在字符串中使用任意数量的换行符("\n")进行调用都不会刷新到输出流,您必须调用newlineflush直接调用.