Implementing statically checked abstractions in Lisp or Clojure using `defmacro` is a royal pain in the rear hole. Error messages from macros being used wrong range from &quot;confusing&quot; at best, to &quot;WTF is this %#$&amp;%#$&amp;?&quot; at worst.<p>Racket supports your argument much better. And Racket is not Lisp: <a href="https:&#x2F;&#x2F;news.ycombinator.com&#x2F;item?id=10763584" rel="nofollow">https:&#x2F;&#x2F;news.ycombinator.com&#x2F;item?id=10763584</a>