Oddly enough, it is much easier to explain Lisp macros to those who have experience with assembly language macros in such “antiques" as the DEC PDP-10 or IBM 360/370 mainframes which supported looping, deconstruction/construction of symbol names (down to individual characters), definition of new macros by macros, access to the assembler’s symbol table at compile time (accessing & mutating the values of symbols and tags), "pass1” vs. “pass2” conditionals (collect data from the whole program in pass 1 and drop it into instruction and/or data locations in pass 2), etc., etc.
But for those whose first or only experience of “macros” came from
the crippled incarnation of them in C, well, you are quite correct,
sadly.