Sou da opinião de que, se uma linguagem possui macros, ela deve ser uma parte bem planejada e integrante da linguagem e não do compilador .
Por exemplo, o sistema macro do Lisp é um recurso de linguagem integrada muito poderoso e está sujeito a todas as regras e regulamentos do próprio Lisp.
Por exemplo, o sistema de macro C / C ++ é separado da linguagem e incorporado ao compilador. O resultado é que você não está limitado às restrições do seu idioma e pode criar código inválido e redefinir palavras-chave específicas do idioma.
No final do dia, existem vários idiomas que não possuem recurso de macro - mas essas gorduras não perdem tanto. Tudo depende de quão expressiva é uma linguagem e se ela tem abordagens alternativas à metaprogramação. A metaprogramação é apenas uma maneira de garantir que, ao fazer X, X seja feito da mesma maneira em todo o aplicativo.