all the things, if macro system is sufficiently sophisticated (ie., hygienic with ability to attach metadata to syntax object). Racket is one of languages with such system, and they implemented static typing using them.
Interestingly, Let Over Lambda eschews hygienic macros because they limit the power (and danger) inherent in macro design.
Interestingly, Let Over Lambda eschews hygienic macros because they limit the power (and danger) inherent in macro design.