With great power comes great responsibility. Macros are necessary and a usefull addition to a language, but their power lies in “being able to do what functions can’t”, and at least my attitude is “there’s a reason functions can’t do it”. Namely, control flow and environment (the second is where closures come in, and that’s a reason why you don’t structure your code using closures instead of functions). Using macros it’s hard to reason about what-does-what, where functions provide very clear-cut possibilities: after the function is done, the next line after the call will be executed (if nothing panicked, that is), and everything it can touch is global stuff or what you passed it. This is very analogous to why you don’t want too many all-global variables, and to using a reference instead of a mutable reference, if possible. Less power is more, because you as a human can reason about it.
Try to read C code where macros don’t follow the “macros are all caps” convention, but are named like functions instead. It’s a total nightmare, and while Rusts macros alleviate quite some problems of C macros, some of that is just inherent to text transformations.