Macros
Macros are not new; we have already used them. Every time we called an expression that ended in an exclamation mark (!
), we in fact called a built-in macro; the !
sign distinguishes it from a function. In our code up until now, we have already used the println!
, the assert_eq!
, the assert!
, the panic!
, the try!
and the vec!
macros.
Why macros?
Macros make powerful language or syntax extensions, and thus metaprogramming, possible; for example, Rust has a regex!
macro which allows for defining regular expressions in your program, which are compiled while your code is compiled. That way the regular expressions are verified and can be optimized at compile time, and so avoid runtime overhead.
Macros can capture repetitive or similar code patterns and replace them with other source code; the macro expands the original code into new code. This expansion happens early in compilation, before any static checking is done, so the resulting code is compiled together with the original code. In this...