Macros Can Be Tricky to Get Right

You’ve already seen plenty of subtleties with macros, such as the need to avoid symbol capture with gensyms, and there’s more to come. While you’re in the great position of knowing all the language’s rules for macro construction, you may still be unclear about the implications of what you know. Let’s look at a few more ways you might accidentally cause yourself grief by making the wrong assumptions about macro code.

Here’s a re-implementation of the clojure.core/and macro that seems fairly straightforward.

beware/and_1.clj
 
(​defmacro​ our-and
 
([] true)
 
([x] x)
 
([x & ​next​]
 
`(​if​ ~x (our-and ~@​next​) ~x)))
 
 
user=> (our-and true true)
 
;=> true
 
user=> (our-and true false)
 
;=> false
 
user=> (our-and ...

Get Mastering Clojure Macros now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.