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