<p><span class="h-card" translate="no"><a href="https://scholar.social/@khinsen" class="u-url mention">@<span>khinsen</span></a></span> <span class="h-card" translate="no"><a href="https://fosstodon.org/@nilesh" class="u-url mention">@<span>nilesh</span></a></span> <br />The simpler answer is, macro expansion happens before parsing. It requires trees, hence it follows the reader; but it has constructs the parser may not know about and, more to the point, *does not need to* know about. So you can have all these extensions without having to change the core AST.</p><p>In practice, some Lisps have sufficiently complex macro systems that you have to interleave expansion and parsing: e.g., if a macro can ask questions like "is this variable bound".</p>