Considere este trecho de código:
(defn foo []
(let [line (apply str (repeat 2 \.))
lines (into [] (repeat 2 line))]
(for [x lines] (println x)) ; this doesn't print
(loop [remaining [[1 2] [3 4]]]
(if (empty? remaining)
(for [y lines] (println y)) ; but this does print
(recur (rest remaining))))))
A saída da execução foo
é:
..
..
(nil nil)
Assim, a linha comentada com this não imprime e não produz saída. Na verdade, posso remover essa linha e obter a mesma saída.
O resultado que eu esperava obter é:
..
..
..
..
(nil nil)
Quando removo todo o loop/recur, a linha funciona como esperado:
(defn foo []
(let [line (apply str (repeat 2 \.))
lines (into [] (repeat 2 line))]
(for [x lines] (println x)))) ; now it prints
Rendimentos
..
..
(nil nil)
como esperado. Por que o loop/recur impede o for/println de gerar saída?
for
é preguiçoso. Se nada usar seu resultado, nada em seu corpo será executado.Para o caso específico de imprimir todas as linhas, você pode simplesmente imprimir a coleção inteira -
(println lines)
.Ou, se você quiser que cada item vá para sua própria linha,
(run! println lines)
.