我想知道为什么以下在 nREPL 中有不同的输出顺序
(map println [1 2 3])
Result:
1
2
3
(nil nil nil)
相对
(map print [1 2 3])
Result:
(nil nil nil)123
为什么应用打印显示返回值,然后显示123?
还要注意,这在 REPL 中有效,在您需要使用的代码中(dorun)
,因为 map 会产生一个惰性序列,并且dorun
实际上会强制打印发生:
(dorun (map print [1 2 3])) ;=> 123
实际上,如果您多次运行第二个,您可能会看到不同的顺序。print
不打印任何换行符,因此不刷新输出缓冲区。你也可以看到:
Result:
123(nil nil nil)
我想第一个示例也可能会更改顺序,但 REPL默认*flush-on-newline*
设置为true
。
它看起来很像输出流缓冲的结果。
flush
您可以通过调用函数强制打印输出流缓冲区中的所有数据:
(defn print! [& args]
(apply print args)
(flush))
(map print! [1 2 3])
; => 123(nil nil nil)