Domain-specific languages
Macros have the ability to create small, embedded languages for solving specific problems. Occasionally, certain problems are not well expressed in the current language, however, they would be very easily expressible in a new, smaller, and more precise language.
Usually, creating a new language requires steps through lexers, parsers, and evaluators to even get the language off the ground. However, macros can extend the current language facilities to accomplish creating an embedded DSL.
A notable DSL example using Elixir and macros is the Ecto project. The Ecto project attempts to provide a similar language to SQL in Elixir for querying data stores. Instead of writing the SQL yourself and passing it to the database connector and letting it execute, the problem of querying data can be expressed in natural terms of Elixir, which, in turn, would be compiled to SQL and sent to the database.
For example, instead of having to write the following query to grab weather data...