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

时间:2014-04-04 04:40:53

标签: 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))

我有一些观察者听取原子a,b,s和c1并在它们改变时打印出一些字符串。使用(print (str uid ":" @o "\n")或println版本。 clojure文档说printprintln的行为应该完全相同,但println中的换行除外,但我没有看到这一点。 当观察者使用println时,我会立即看到字符串。当观察者使用print时。我只在调用下一个println时看到输出。下面我的输出为printlnprint。 使用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将其内容刷新到控制台。

3 个答案:

答案 0 :(得分:5)

仔细查看printlnprint的Clojure来源code。区别在于println调用prn并打印调用pr。在prn中调用 function newline。然后它检查 flush-on-new-line ,如果是,则显式调用flush。因此,在字符串中使用任意数量的换行符(" \ n")调用print将不会刷新到输出流,您必须调用newline或调用flush直接。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

根据Clojure documentation,默认情况下会在每个换行符上刷新输出。所以你可能必须显式刷新输出才能得到你想要的东西。