¿Cuándo el uso de if-let
en lugar de let
hace que el código se vea mejor y tiene algún impacto en el rendimiento?Cuándo usar let vs. if-let en Clojure
Respuesta
supongo if-let debe usarse cuando desea referenciar el valor de una condición if
en la parte "then
" del código:
es decir, en lugar de
(let [result :foo]
(if result
(do-something-with result)
(do-something-else)))
se escribe:
(if-let [result :foo]
(do-something-with result)
(do-something-else))
que es un poco más limpio, y le ahorra sangría un nivel más. En lo que va de eficiencia, se puede ver que la expansión de la macro no agrega mucho sobrecarga:
(clojure.core/let [temp__4804__auto__ :foo]
(if temp__4804__auto__
(clojure.core/let [result temp__4804__auto__]
(do-something-with result))
(do-something-else)))
Esto también ilustra que no puede ser mencionada en la parte "else
" del código de la unión.
Un buen caso de uso para if-let
es eliminar la necesidad de utilizar anáforas. Por ejemplo, el lenguaje de programación Arc proporciona una macro llamada aif
que le permite vincular una variable especial llamada it
dentro del cuerpo de un formulario if
cuando una expresión dada se evalúa como verdadera lógica. Podemos crear lo mismo en Clojure:
(defmacro aif [expr & body]
`(let [~'it ~expr] (if ~'it (do [email protected]))))
(aif 42 (println it))
; 42
Esto está muy bien y bueno, excepto que la anáfora no anidan, pero if-let
hace:
(aif 42 (aif 38 [it it]))
;=> [38 38]
(aif 42 [it (aif 38 it)])
;=> [42 38]
(if-let [x 42] (if-let [y 38] [x y]))
;=> [42 38]
Encontrado muy útil. – octopusgrabbus
- 1. let vs letfn para definir funciones locales en clojure?
- 2. Cuándo usar Ruby vs Cuándo usar PHP
- 3. ¿Cuándo debería usar deftype en Clojure?
- 4. Cuándo usar atributos vs. cuándo usar propiedades en python?
- 5. Cuándo usar node.js vs sinatra vs rails?
- 6. ¿Cuándo usar Literal vs LiteralControl?
- 7. Cuándo usar SQLITE_TRANSIENT vs SQLITE_STATIC?
- 8. cuándo usar Set vs. Collection?
- 9. Cuándo usar strtr vs str_replace?
- 10. Cuándo usar Algoritmos genéticos vs. cuándo usar redes neuronales?
- 11. Redefinición de una variable let en dloj Clojure
- 12. ¿Cuándo usar UserControl vs. Control en Silverlight?
- 13. Cuándo usar $ stderr vs STDERR en Ruby?
- 14. Cuándo usar MojoExecutionException vs MojoFailureException en Maven
- 15. LET versus LET * en Common Lisp
- 16. ¿Cuándo debería usar === vs ==,! == vs! =, Etc. en javascript?
- 17. defn vs. let respecto a la descomposición
- 18. Python - Cuándo usar el archivo vs abrir
- 19. Pepino: Cuándo usar etiquetas/ganchos vs fondos
- 20. Cuándo usar clases estáticas vs instanciadas
- 21. ¿Cuándo debería usar make_heap vs. Priority Queue?
- 22. Android: Cuándo usar Dialog vs. Activity
- 23. IEnumerable, IEnumerator vs foreach, cuándo usar lo
- 24. Cuándo usar Spring Integration vs. Camel?
- 25. Android: ¿Cuándo usar Service vs Singleton?
- 26. Cuándo usar printf/scanf vs cout/cin?
- 27. Flex - Remoting vs HTTPService - cuándo usar qué?
- 28. Herencia privada VS composición: cuándo usar qué?
- 29. Cuándo usar actores locales vs remotos?
- 30. Cuándo utilizar Tuberías vs Cuándo usar Memoria compartida
Además, no es posible tener más de 2 formas en el vector de enlace de if-let. Por ejemplo: (if-let [a 20 b nil] (println a)) - ¡no funciona! –
También hay 'when-let'. –