Interfaces variadicas

Una interfaz variadica toma un número arbitrario de argumentos. Por ejemplo, println! puede tomar un número arbitrario de argumentos, según lo determinado por la cadena de formato.

Podemos extender nuestro macro calcula! de la sección anterior para que sea variadica:

macro_rules! calcula {
    // El patrón para un solo `eval`
    (eval $e:expr) => {{
        {
            let val: usize = $e; // Fuerza que los tipos sean enteros
            println!("{} = {}", stringify!{$e}, val);
        }
    }};

    // Descompone múltiples `eval`s de forma recursiva
    (eval $e:expr, $(eval $es:expr),+) => {{
        calcula! { eval $e }
        calcula! { $(eval $es),+ }
    }};
}

fn main() {
    calcula! { // ¡Mira mamá! `calcula!` variadica!
        eval 1 + 2,
        eval 3 + 4,
        eval (2 * 3) + 1
    }
}

Salida:

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