地图打印与地图println在Clojure中

时间:2015-07-16 02:01:47

标签: clojure nrepl

我想知道为什么以下在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?

3 个答案:

答案 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)