tutorial online example clojure

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]