The preprocessor struggles to parse the code.
The only thing you can statically parse in Perl is POD.°
But the lisp macro gets the code (or rather AST) for free. No confusion where it begins or ends and about the elements in between.
When OOP became popular, various lisp dialects just added some macros for implemention. Backwards compatibility included.
(addicted to the Perl Programming Language :)
Wikisyntax for the Monastery
°) well as POD, you can't make it to code. Mind you:
POD inside a here doc is both string code and extractable comment.