Soy de la opinión de que si un lenguaje tiene macros, debe ser una parte integral y bien planificada del lenguaje y no del compilador .
Ejemplo, el sistema macro de Lisp es una característica de lenguaje integrado muy potente y está sujeta a todas las reglas y regulaciones de Lisp.
Contraejemplo, el sistema macro C / C ++ está separado del lenguaje y está integrado en el compilador. El resultado es que no está limitado a las restricciones de su idioma y puede crear código no válido y redefinir palabras clave específicas del idioma.
Al final del día, hay varios idiomas que no tienen función de macro, pero no se echan de menos esas características. Todo depende de cuán expresivo sea un lenguaje y de si tiene enfoques alternativos para la metaprogramación. La metaprogramación es solo una forma de garantizar que cuando haces X, X se hace de la misma manera en toda la aplicación.