печать в ближайшем будущем!(в ленивой последовательности) - PullRequest
1 голос
/ 14 октября 2011

1) (def x (for [i (range 1 3)] (do (println i) i)))

2) (def x (for [i (range 1 3)] (do i)))

И то, и другое дает одинаковый вывод, тогда зачем использовать println?

Ответы [ 2 ]

10 голосов
/ 14 октября 2011

Значения оцениваются сами по себе, а блок do возвращает результат последнего выражения. Вот почему (do 2) возвращает 2, в примере ниже. Поскольку он возвращает 2, при получении значения из REPL 2 будет выведено на экран в результате. Однако функция println вызывает побочный эффект, но возвращает ноль. Побочным эффектом ниже является то, что значение 2 будет напечатано на стандартный вывод. Также печатается nil, потому что это возвращаемое значение из функции println.

user=> (do 2)
2
user=> (println 2)
2
nil

В вашем примере выходные данные не одинаковы из-за того, что я объяснил выше. Заметьте разницу сами:

user=> (def x (for [i (range 1 3)] (do (println i) i)))
#'user/x
user=> x
(1
2
1 2)
user=> (def x (for [i (range 1 3)] (do i)))
#'user/x
user=> x
(1 2)

Также обратите внимание, что для ленивый :

(def x (for [i (range 1 3)] (do (println i) i)))
#'user/x
user=> x
(1
2
1 2)
user=> x
(1 2)

Во второй раз, когда запрашивается x, печатается только (1 2). Зачем? Потому что ленится. Он создает свои элементы только в первый раз, когда они запрашиваются (в первый раз, когда запрашивается x). В следующий раз элементы уже произведены, поэтому побочный эффект внутри do больше не повторится.

7 голосов
/ 14 октября 2011

В REPL они могут выдавать (примерно) один и тот же вывод, но не будут запускаться из скомпилированной программы.P в REPL означает Print - он печатает значение текущего выражения.

Попробуйте скомпилировать в Jar и запустить его, чтобы увидеть разницу.Также никогда не забывайте, что использование println означает, что ваша функция имеет побочные эффекты;вы можете обнаружить, что вам нужно форсировать оценку функции (например, в do) для получения результата.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...