Repetitions in macros
Apart from token tree types, we also need a way to repeatedly generate certain parts of our code. One of the practical examples from the standard library is the vec![]
macro, which relies on repetition to give an illusion of variadic arguments, and allows you to create Vecs in any of the following manners:
vec![1, 2, 3]; vec![9, 8, 7, 6, 5, 4];
Let's see how vec!
does this. Here's vec's macro_rules!
definition from the standard library:
macro_rules! vec { ($elem:expr; $n:expr) => ( $crate::vec::from_elem($elem, $n) ); ($($x:expr),*) => ( <[_]>::into_vec(box [$($x),*]) ); ($($x:expr,)*) => (vec![$($x),*]) }
By ignoring the details to the right of =>
and focusing on the last two matching rules on the left-hand side, we can see something new in these rules:
($($x:expr),*) ($($x:expr,)*)
These are repeating rules. The repeating pattern rule follows:
- pattern:
$($var:type)*
. Notice the$()*
. For the sake of referring to them...