Oftentimes, I want to make some computation, apply the result to a predicate, and if it passes, return that result. If the predicate does not succeed, I usually want to return some other value. I’ve run into this situation before, with no satisfying resolution. My code usually ends up looking like so:
(let [value (some-computation x y z)] (if (check? value) value some-other-default-value))
Which is overly verbose, even for Clojure, if you ask me. There’s a
value appears 3 times for a fairly straightforward idiom. I think what I’d like to write instead is:
(guard check? (some-computation x y z) some-other-default-value)
The following macro does the trick of expanding to the verbose form I’ve been writing:
(defmacro guard [pred then else] `(let [x# ~then] (if (~pred x#) x# ~else)))
Now, the awkward thing about the above is that unlike an if-statement, the order in which you read things is not the order in which they get executed in. Reading it, the execution happens on line 2 first, line 1 second, and then possibly on line 3. My question to the blogosphere is, does Clojure already have something like this lurking in a lib somewhere? Or is there a blindingly obvious solution to this that I’m overlooking?