2010-01-06 8 views

Respuesta

69

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.

+9

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! –

+1

También hay 'when-let'. –

30

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] 
+0

Encontrado muy útil. – octopusgrabbus

Cuestiones relacionadas