1

我想知道为什么以下在 nREPL 中有不同的输出顺序

(map println [1 2 3])

Result:
1
2
3
(nil nil nil)

相对

(map print [1 2 3])

Result:
(nil nil nil)123

为什么应用打印显示返回值,然后显示123?

4

3 回答 3

2

还要注意,这在 REPL 中有效,在您需要使用的代码中(dorun),因为 map 会产生一个惰性序列,并且dorun实际上会强制打印发生:

(dorun (map print [1 2 3])) ;=> 123
于 2015-07-16T21:48:45.553 回答
1

实际上,如果您多次运行第二个,您可能会看到不同的顺序。print不打印任何换行符,因此不刷新输出缓冲区。你也可以看到:

Result:
123(nil nil nil)

我想第一个示例也可能会更改顺序,但 REPL默认*flush-on-newline*设置为true

于 2015-07-16T02:18:18.287 回答
0

它看起来很像输出流缓冲的结果。

flush您可以通过调用函数强制打印输出流缓冲区中的所有数据:

(defn print! [& args]
  (apply print args)
  (flush))

(map print! [1 2 3])
; => 123(nil nil nil)
于 2015-07-16T02:20:40.110 回答