Как говорит Ли, если вам нужны только побочные эффекты, такие как печать, doseq
является лучшим решением, поскольку оно никогда не возвращает значение, отличное от nil
.
Если вы хотите использовать цикл for
, вы можете удалить лень, поместив его в выражение (vec ...)
, что приведет к немедленному запуску цикла for
. Таким образом, мы получаем:
(println :start)
(vec
(for [a [1 2 3]]
(println a)))
(println :end)
с результатом:
:start
1
2
3
:end
Без vec
мы получаем поведение, которое вы видели:
(println :start)
(for [a [1 2 3]]
(println a))
(println :end)
с результатом:
:start
:end
Я почти никогда не хочу ленивых результатов, так как неопределенность, связанная с при вычислении, может затруднить отладку. Я использую приведенную выше конструкцию так часто, что написал небольшой макрос forv
, который всегда возвращает векторный результат, аналогично функции mapv
.