¿Cuál es la diferencia entre doseq y for en Clojure? ¿Cuáles son algunos ejemplos de cuándo elegiría usar uno sobre el otro?
105
La diferencia es que forcrea una secuencia diferida y la devuelve mientras doseqes para ejecutar efectos secundarios y devuelve nil.
user=> (for [x [1 2 3]] (+ x 5))
(6 7 8)
user=> (doseq [x [1 2 3]] (+ x 5))
nil
user=> (doseq [x [1 2 3]] (println x))
1
2
3
nil
Si desea crear una nueva secuencia basada en otras secuencias, use for. Si desea hacer efectos secundarios (imprimir, escribir en una base de datos, lanzar una ojiva nuclear, etc.) basados en elementos de algunas secuencias, use doseq.
Tenga en cuenta también que
doseqestá ansioso mientras quefores perezoso. El ejemplo que falta en la respuesta de Rayne esEn el REPL, esto generalmente hará lo que quieras, pero eso es básicamente una coincidencia: el REPL fuerza la secuencia perezosa producida por
for, lo que hace que suceda la impresión. En un entorno no interactivo, nunca se imprimirá nada. Puede ver esto en acción comparando los resultados deDebido a que el
defformulario devuelve la nueva var creada, y no el valor que está vinculado a ella, no hay nada para que el REPL imprima ylazyse referirá a un lazy-seq no realizado: ninguno de sus elementos se ha calculado en absoluto.eagerse referiránil, y se habrá realizado toda su impresión.fuente