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
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
(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 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 (
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:
if should always have both “then” and “else” branches.
when for a condition which should return
nil in the negative case.