In the recent production release of Scala 2.10 we have introduced macros, an
experimental facility which gives its users compile-time metaprogramming
powers. Alongside of the mainline release of Scala Macros, we have also
introduced other macro flavors, which provide their users with
different interfaces and capabilities for interacting with the Scala compiler.

In this paper, we show how the rich syntax and static types of Scala synergize with
macros, through a number of real case studies using our macros (some of which
are production systems) such as language virtualization, type providers,
materialization of type class instances, type-level programming, and embedding of external DSLs.
We explore how macros enable new and unique ways to use pre-existing language features such as implicits,
dynamics, annotations, string interpolation and others, showing along the way
how these synergies open up new ways of dealing with software development
challenges.