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,