Use macros sparingly: add syntax only when functions can’t express the shape you need.
Macros can make a DSL feel natural—because they can control evaluation and rewrite code forms. But macros also raise the cost of debugging and testing if overused.
This section focuses on good macro discipline: when a macro is justified, how to keep expansions readable, and how to provide helpful errors when a DSL is misused.