2015-07-16 3 views
1

Я задаюсь вопросом, почему следующие имеют различные выходные порядков в nREPLкарта печать против карты Println в Clojure

(map println [1 2 3]) 

Result: 
1 
2 
3 
(nil nil nil) 

Versus

(map print [1 2 3]) 

Result: 
(nil nil nil)123 

Почему нанесение печати показывают возвращаемое значение, а затем дисплей 123?

ответ

1

На самом деле, вы можете увидеть другой порядок, если вы запускаете второй один раз. print не печатает никаких новых строк, поэтому выходной буфер не очищается. Вы могли бы очень хорошо, также смотрите:

Result: 
123(nil nil nil) 

Я полагаю, что первый пример, возможно, изменить порядок, тоже, но РЕПЛ имеет *flush-on-newline* набор для true по умолчанию.

0

Это похоже на результат буферизации выходного потока.

Вы можете принудительно распечатать все данные в выходном буфере потока, вызвав flush function:

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

(map print! [1 2 3]) 
; => 123(nil nil nil) 
1

также отметить, что это работает в РЕПЛ, в коде, необходимо использовать (dorun), поскольку карта производит ленивую последовательность и dorun фактически заставляет печать случиться:

(dorun (map print [1 2 3])) ;=> 123 
+0

Вы можете использовать также следующую форму для печати массива: (печать (применяется ул [1 2 3])) – akazlou

Смежные вопросы