Variadic Interfaces

A variadic interface takes an arbitrary number of arguments. For example,
println! can take an arbitrary number of arguments, as determined by the
format string.

We can extend our calculate! macro from the previous section to be variadic:

  1. macro_rules! calculate {
  2. // The pattern for a single `eval`
  3. (eval $e:expr) => {{
  4. {
  5. let val: usize = $e; // Force types to be integers
  6. println!("{} = {}", stringify!{$e}, val);
  7. }
  8. }};
  9. // Decompose multiple `eval`s recursively
  10. (eval $e:expr, $(eval $es:expr),+) => {{
  11. calculate! { eval $e }
  12. calculate! { $(eval $es),+ }
  13. }};
  14. }
  15. fn main() {
  16. calculate! { // Look ma! Variadic `calculate!`!
  17. eval 1 + 2,
  18. eval 3 + 4,
  19. eval (2 * 3) + 1
  20. }
  21. }

Output:

  1. 1 + 2 = 3
  2. 3 + 4 = 7
  3. (2 * 3) + 1 = 7