I think the lack of reader macros really help here. Macros in Clojure are much more "functions that run at compile time" rather than "look at this fun DSL I threw together".
What I think it comes down to though is adherence to convention. A preference hierarchy has grown together with Clojure and it goes:
1. Can it be expressed using data structures, do that. For example a map/dictionary lookup.
2. If that fails, express your more complex idea using a function.
3. If you absolutely must, write a macro.
You usually end up with very few macros except for those in the standard library, and those you end up with are more commonly of the convenience kind. One example would be the standard web routing library of the early 10's called Compojure that relied heavily on macros where my current favourite Reitit uses just data.
What I think it comes down to though is adherence to convention. A preference hierarchy has grown together with Clojure and it goes:
1. Can it be expressed using data structures, do that. For example a map/dictionary lookup. 2. If that fails, express your more complex idea using a function. 3. If you absolutely must, write a macro.
You usually end up with very few macros except for those in the standard library, and those you end up with are more commonly of the convenience kind. One example would be the standard web routing library of the early 10's called Compojure that relied heavily on macros where my current favourite Reitit uses just data.