guarding an expression
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 let and 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?

4 comments