Clojure no es un lenguaje funcional puro, por lo tanto tiene funciones con efecto secundario. Vamos a ver algunas :
dotimes :
user=> (dotimes [i 3]
(println i))
0
1
2
nil
Muy parecido a un for, empieza de 0 y sigue hasta 3 - 1.
doseq :
user=> (doseq [n (range 3)]
(println n))
0
1
2
nil
Itera sobre una secuencia (evaluandola si es lazy). Tambien existe la variante que procesa todas las permutaciones del contenido de la secuencia, veamos un ejemplo :
user=> (doseq [letter [:a :b]
number (range 3)] ; list of 0, 1, 2
(prn [letter number]))
[:a 0]
[:a 1]
[:a 2]
[:b 0]
[:b 1]
[:b 2]
nil
for :
user=> (for [letter [:a :b]
number (range 3)] ; list of 0, 1, 2
[letter number])
([:a 0] [:a 1] [:a 2] [:b 0] [:b 1] [:b 2])
La función for se utiliza para generar listas, como listas por comprensión.