Это будет с нетерпением потреблять весь seq, вызывая все функции для побочных эффектов и возвращая все, что возвращает последний:
(reduce #(%2) nil [#(println :foo) #(println :bar)])
; => prints :foo, then :bar, then returns nil
Если вы хотите сохранить возвращаемые значения, вы можете использовать reductions
вместо этого:
(reductions #(%2) nil [#(println :foo) #(println :bar)])
; => prints :foo, then :bar, then returns (nil nil)
reductions
находится в clojure.contrib.seq-utils
в Clojure 1.1 и в clojure.core
в текущих снимках 1.2.
Обновление: Обратите внимание, чтоreductions
возвращает ленивый seq, так что это не улучшение по сравнению с map
(примечание: в map
вы бы хотели использовать #(%)
вместо #(%2)
).Я упомянул это здесь в основном для полноты.Фактически, я опубликовал полный ответ для полноты, потому что обычно я бы использовал подход doseq
(см. Ответ Брайана).