Macros are a wonderful thing. A hygienic macro system puts language extensions within the reach of non-compiler-hackers.
However, to date, most modern, hygienic macro systems are associated with languages like Scheme and Racket that are quite high-level. My claim is that macros are probably much more useful in low-level languages. Here’s why: