I see no disadvantages. Why does Clojure not do it this way? The purpose of macros is to sit between the reader and the evaluator. But why does Clojure not uses normal functions for this? Why is there the restriction that macros do not support recursion if this can be achieved so easily?
Could I define my own version of defmacro that uses functions in this way? It would be like this:
Plenty of people do. Using a macro as a wrapper around a form-manipulating function that does all the work is one of the most common recommendations that I encounter online when people ask about complicated macros.
Why does Clojure not do it this way?
The question is ambiguous.
If you mean why defmacro doesn’t actually define two vars, like your defrecursivemacro does, that it’s self-explanatory - because it defines two vars instead of one. It does more work than one might need, it has a hard-coded suffix "_macro", it hinders full-text search.
If you mean by the standard library of Clojure doesn’t use that approach - well, it doesn’t need to. Its macros work just fine they way they’re written.
clojure.core uses auxillary functions all over the place to help implement more complex macros that emit/process a lot of code. deftype/defrecord do (emit-deftype*, emit-defrecord). Many of the user-presented macros (like loop, let, etc) that wrap the special forms, used auxillary functions to implement destructuring and argument verification.
Clojure does use functions to implement macros in lots of places, particularly in more complex macros. For example, the internal destructure function does all the heavy lifting to implement destructuring in let, loop, etc. All the polymorphism features like defrecord, deftype, defprotocol etc make extensive use of helper functions (these features are really a hybrid of macros, functions, and compiler impl).
Right, I should’ve been more precise. I meant the macros that do not use any functions that are meant only to help that macro manipulate forms. Plenty of those as well.