¿Cuál es la diferencia entre doseq y para en Clojure? ¿Cuáles son algunos ejemplos de cuándo elegirías usar uno sobre el otro?Diferencia entre dosisq y para en Clojure
Respuesta
La diferencia es que for
crea una secuencia diferida y la devuelve, mientras que doseq
es para la ejecución de efectos secundarios y devuelve nada.
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 construir una nueva secuencia basada en otras secuencias, utilícela para. Si desea hacer efectos secundarios (imprimir, escribir en una base de datos, lanzar una ojiva nuclear, etc.) en base a elementos de algunas secuencias, use doseq.
Tenga en cuenta también que doseq
está ansioso mientras que for
es flojo. El ejemplo que faltan en la respuesta de Rayne es
(for [x [1 2 3]] (println x))
Al REPL, por regla general, va a hacer lo que quiere, pero eso es básicamente una coincidencia: el REPL obliga a la secuencia perezosa producido por for
, haciendo que los printlns sucedan. En un entorno no interactivo, nunca se imprimirá nada. Se puede ver esto en acción mediante la comparación de los resultados de
user> (def lazy (for [x [1 2 3]] (println 'lazy x)))
#'user/lazy
user> (def eager (doseq [x [1 2 3]] (println 'eager x)))
eager 1
eager 2
eager 3
#'user/eager
Debido a la forma def
devuelve la nueva var creado, y no el valor que está ligado a ella, no hay nada para el REPL para imprimir, y lazy
se referirá a un lazy-seq no realizado: ninguno de sus elementos ha sido calculado en absoluto. eager
se referirá a nil
, y se habrá realizado toda su impresión.
¿Cómo maneja la dosisq la evaluación de la secuencia infinitamente floja? ¿mala idea? solo llámalo en secuencias finitas, ya sea ansioso o perezoso? – johnbakers
@johnbakers Bloqueará para siempre hasta que se interrumpa la evaluación. Clojure nunca intenta manejar secuencias infinitas de una manera diferente a las secuencias finitas. –
- 1. Diferencia en Clojure entre uso y requiere
- 2. Diferencia entre definición y defprotocol en Clojure
- 3. ¿Cuál es la diferencia entre '() y (lista) en Clojure?
- 4. ¿Cuál es la diferencia entre: while y: when in clojure?
- 5. ¿Hay alguna diferencia entre la sintaxis fn y # para funciones anónimas en Clojure?
- 6. Diferencia entre & y &
- 7. Diferencia entre. y: en Lua
- 8. Diferencia entre == y === en JS
- 9. Diferencia entre '' y "" en Python
- 10. Diferencia entre '.' y "." en java
- 11. MySQL: diferencia entre ', `,' y"
- 12. La diferencia entre $ * y $ @
- 13. Diferencia entre. y #
- 14. ¿Diferencia entre == y caso?
- 15. Diferencia entre objeto y *?
- 16. VBA: Diferencia entre y y +
- 17. Diferencia entre "y" y "donde" en une
- 18. Diferencia entre "y" y && en Ruby?
- 19. En Clojure, diferencia entre función, función citada y función de cita nítida
- 20. En Lisp (Clojure, Emacs Lisp), ¿cuál es la diferencia entre la lista y la cita?
- 21. Diferencia entre cadena de lectura y cadena de carga en Clojure
- 22. ¿Cuál es la diferencia entre el procedimiento y el procedimiento # 'en Lisp/Clojure?
- 23. Diferencia entre dos mapas
- 24. Diferencia entre java y javaw
- 25. Diferencia entre JPA y JDO?
- 26. Diferencia entre malloc y dlmalloc
- 27. Diferencia entre GNUWin32 y cygwin
- 28. Diferencia entre NetworkStream.Read() y NetworkStream.BeginRead()?
- 29. Diferencia entre SimpleDB y S3
- 30. Diferencia entre LEA y MOVE.L?
Gran respuesta. ¡Gracias! –
ahora que son muchos los efectos secundarios ... el lanzamiento de una ojiva nuclear :) – Marc
¡Gracias! Tenía mi cabello (desaparecido) con "para" que nunca dispare mis ojivas nucleares sobre mi lista de artículos. "doseq" seguro sí. –