A short Clojure don’t for today. This one is my style preference.
You have a single expression which should run if a condition is true, otherwise return nil
.
Most Clojure programmers would probably write this:
(when (condition? ...) (then-expression ...))
But you could also write this:
(if (condition? ...) (then-expression ...) nil)
Or even this, because the “else” branch of if
defaults to nil
:
(if (condition? ...) (then-expression ...))
There’s an argument to be made for any one of these.
The second variant, if ... nil
, makes it very explicit that you want to return nil
. The nil
might be semantically meaningful in this context instead of just a “default” value.
Some people like the third variant, if
with no “else” branch, because they think when
is only for side-effects, leaving the single-branch if
for “pure” code.
But for me it comes down, as usual, to readability.
The vast majority of the time, if
contains both “then” and “else” expressions.
Sometimes a long “then” branch leaves the “else” branch dangling below it. I’m expecting this, so when I read an if
my eyes automatically scan down to find the “else” branch.
If I see an if
but don’t find an “else” branch, I get momentarily confused. Maybe a line is missing or the code is mis-indented.
Likewise, if I see an if
explicitly returing nil
, it looks like a mistake because I know it could be written as when
. This is a universal pattern in Clojure: lots of expressions (cond
, get
, some
) return nil
as their default case, so it’s jarring to see a literal nil
as a return value.
So my preferred style is the first version. In general terms:
An if
should always have both “then” and “else” branches.
Use when
for a condition which should return nil
in the negative case.
I would often use
(and (condition? ...) (then-expression ...))
there.When I see “a long “then” branch” then it automatically makes me refactor it to ComposedMethod/Function to make it readable.
Good series. Thanks!
I like “when” in the case you describe because it has no variations. It only works one way – hence your code is simpler.