Las macros son una parte poderosa del conjunto de herramientas de un programador de Rust, y las macros por ejemplo son una forma relativamente sencilla de acceder a este poder. ¡Escribamos una!
¿Qué es una macro? Wikipedia lo describe así:
Una macro (abreviatura de «macroinstrucción», del griego μακρός 'largo') en informática es una regla o patrón que especifica cómo una determinada secuencia de entrada (a menudo una secuencia de caracteres) debe asignarse a una secuencia de salida de reemplazo (también a menudo una secuencia de caracteres) de acuerdo con un procedimiento definido. El proceso de asignación que instancia (transforma) un uso de macro en una secuencia específica se conoce como expansión de macros.
¡Qué esclarecedor! Pero, para ser más concretos, las macros son una sintaxis especial que te permite generar código en tiempo de compilación. Las macros se pueden usar para cálculos en tiempo de compilación, pero, más a menudo, son solo otra forma de abstraer tu código. Por ejemplo, probablemente ya hayas usado println!() y vec![]. Ambas aceptan un número arbitrario de argumentos, así que no puedes expresarlas como funciones simples. Por otro lado, siempre se expanden a una cierta cantidad de código Rust absolutamente estándar. Si te interesa, puedes usar el subcomando cargo expand para ver los resultados de la expansión de macros en tu código.
Para obtener más información sobre las macros en Rust, The Rust Book tiene un buen capítulo sobre ellas.
Puedes producir un Vec de longitud arbitraria en línea usando la macro vec![]. Sin embargo, Rust no incluye una forma de producir un HashMap en línea. Soluciona esto escribiendo una macro hashmap!().
Por ejemplo, un usuario de tu biblioteca podría escribir hashmap!('a' => 3, 'b' => 11, 'z' => 32). Esto debería expandirse al siguiente código:
{
let mut hm = HashMap::new();
hm.insert('a', 3);
hm.insert('b', 11);
hm.insert('z', 32);
hm
}
Ten en cuenta que el maplit crate proporciona una macro que resuelve perfectamente este ejercicio. Implementa tu propia solución en lugar de usar este crate; haz un intento por tu cuenta antes de ver su código fuente.
Regístrate en Exercism para aprender y dominar Rust con 99 ejercicios y mentoría humana real, todo gratis.