Обратите внимание, что doseq
стремится, а for
ленится. Пример, отсутствующий в ответе Рэйна:
(for [x [1 2 3]] (println x))
В REPL это обычно будет делать то, что вы хотите, но это в основном совпадение: REPL заставляет ленивую последовательность, генерируемую for
, вызывать печать printlns. В неинтерактивной среде ничего не будет напечатано. Вы можете увидеть это в действии, сравнив результаты
user> (def lazy (for [x [1 2 3]] (println 'lazy x)))
#'user/lazy
user> (def eager (doseq [x [1 2 3]] (println 'eager x)))
eager 1
eager 2
eager 3
#'user/eager
Поскольку форма def
возвращает созданную новую переменную, а не значение, связанное с ней, REPL ничего не печатает, и lazy
будет ссылаться на нереализованный lazy-seq: ни один из его элементов были вычислены на всех. eager
будет ссылаться на nil
, и вся его печать будет выполнена.