When to use let vs. if-let in Clojure

clojure

Solution

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.

Problem

When does using `if-let` rather than `let` make code look better and does it have any performance impact?

Original source