online - Cuándo usar let vs. if-let en Clojure
clojure windows (2)
¿Cuándo usar if-let
lugar de let
que el código se vea mejor y tiene algún impacto en el rendimiento?
Supongo que if-let debería usarse cuando quisiera hacer referencia al 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)))
usted escribe:
(if-let [result :foo]
(do-something-with result)
(do-something-else))
que es un poco más ordenado, y le ahorra sangría un nivel más. En lo que respecta a la eficiencia, puede ver que la expansión de macro no agrega mucha 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 se puede hacer referencia a la vinculación en la parte " else
" del código.
Un buen caso de uso para if-let
es eliminar la necesidad de usar anáforas. Por ejemplo, el lenguaje de programación de Arc proporciona una macro llamada aif
que le permite vincular una variable especial llamada dentro del cuerpo de una forma 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 ~@body))))
(aif 42 (println it))
; 42
Esto está bien y bien, excepto que la anáfora no anida, 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]