Since there's a lot in your comments, and comments can be deleted and aren't searchable, I'll add this info as an answer. As @db48x said, the macro call is expanded to produce some code, and that code is then evaluated.
Macro expansion is pure reduction, just like what pure functional programming does. The macro arguments are not evaluated, to start with, and some or all of them might never be evaluated during the macro call - they might even be ignored altogether.
Macro expansion need not really expand anything. What it does, using Lisp code, is produce some Lisp code.
After macro expansion, as the second step of evaluating a macro call, the code produced by the first step (macro expansion) is evaluated, and the result of that evaluation is returned.
In sum, Lisp sees a macro call, and ends up evaluating some code and returning its value. What code does it evaluate? The code generated by the macro definition - during the step that's called macro "expansion".
The macro definition, i.e., the code in the macro that generates code, doesn't evaluate that code. The Lisp interpreter sees a macro call, and to evaluate/interpret it, it uses the macro's code to perform macro expansion, and then the interpreter evaluates the result of that expansion.
Typically, the code in the macro-defining body that generates the code to evaluate does something with one or more of the arguments passed in the call. Typically, the arguments determine what code gets generated, in some way (e.g. condition tests).
The macro code that generates the code to be evaluated can, but it doesn't have to, evaluate one or more of the arguments.
Generally speaking, macro code doesn't perform side effects. If you're writing macro code that does that, then you're likely doing the wrong thing.
The only purpose of the macro code is to create the Lisp code that will be evaluated - nothing more. To do that, it can do anything it needs/wants to do, using anything Lisp provides.