Many simple macro use cases are covered by lightweight lambda syntax, reflection, or language constructs, e.g. Go's defer, Python's with, and C#'s using. Complex macros can create DSLs or rewrite code for optimization, though. Series[0] is a Common Lisp library that rewrites lazy streams into an imperative loop. LOOP[1] and ITERATE[2] are DSLs for iteration. Schelog[3] embeds Prolog inside of Scheme. Serde[4] generates serialization code.
Here are some old threads on the Lightweight Languages mailing list that discuss use cases for macros. Participants include Trevor Blackwell, Paul Graham, Dave Moon, Todd Proebsting, Guy Steele, Dan Weinreb, and many others.
• Macros Make Me Mad [5]
• macros vs. blocks [6]
• how expressive are they [7]
[0] https://www.cs.cmu.edu/Groups/AI/html/cltl/clm/node347.html
[1] https://gigamonkeys.com/book/loop-for-black-belts.html
[2] https://iterate.common-lisp.dev/
[3] https://ds26gte.github.io/schelog/index.html
[4] https://serde.rs/derive.html
[5] https://people.csail.mit.edu/gregs/ll1-discuss-archive-html/...
[6] https://people.csail.mit.edu/gregs/ll1-discuss-archive-html/...
[7] https://people.csail.mit.edu/gregs/ll1-discuss-archive-html/...