When does using if-let
rather than let
make code look better and does it have any performance impact?
They're used like let to bind values to variables, but if a value is nil then when-let will return nil without running the body, and if-let will execute its alternative branch.
Clojure let is used to define new variables in a local scope. These local variables give names to values. In Clojure, they cannot be re-assigned, so we call them immutable.
Clojure defines many algorithms in terms of sequences (seqs). A seq is a logical list, and unlike most Lisps where the list is represented by a concrete, 2-slot structure, Clojure uses the ISeq interface to allow many data structures to provide access to their elements as sequences.
I guess if-let should be used when you'd like to reference an if
condition's value in the "then
" part of the code:
i.e. instead of
(let [result :foo] (if result (do-something-with result) (do-something-else)))
you write:
(if-let [result :foo] (do-something-with result) (do-something-else))
which is a little neater, and saves you indenting a further level. As far as efficiency goes, you can see that the macro expansion doesn't add much overhead:
(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)))
This also illustrates that the binding can't be referred to in the "else
" part of the code.
A good use case for if-let
is to remove the need to use anaphora. For example, the Arc programming language provides a macro called aif
that allows you to bind a special variable named it
within the body of an if
form when a given expression evaluates to logical true. We can create the same thing in Clojure:
(defmacro aif [expr & body] `(let [~'it ~expr] (if ~'it (do ~@body)))) (aif 42 (println it)) ; 42
This is fine and good, except that anaphora do not nest, but if-let
does:
(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]
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With