Macros

Macros

Difícil

Instrucciones

Las macros son una parte poderosa del conjunto de herramientas de quien programa en Rust, y las macros por ejemplo son una forma relativamente sencilla de acceder a ese poder. ¡Escribamos una!

Contexto

¿Qué es una macro? Wikipedia la describe así:

Una macro (abreviatura de «macroinstrucción», del griego μακρός, 'largo') en ciencias de la computación es una regla o patrón que especifica cómo debe mapearse una determinada secuencia de entrada (a menudo una secuencia de caracteres) a una secuencia de salida de reemplazo (también a menudo una secuencia de caracteres) de acuerdo con un procedimiento definido. El proceso de mapeo que instancia (transforma) el uso de una macro en una secuencia específica se conoce como expansión de macros.

¡Iluminador! 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 hacer cálculos en tiempo de compilación, pero con más frecuencia son solo otra forma de abstraer tu código. Por ejemplo, probablemente ya usaste println!() y vec![]. Cada una recibe una cantidad arbitraria de argumentos, así que no puedes expresarlas como funciones simples. Por otro lado, siempre se expanden a 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 más información sobre las macros en Rust, The Rust Book tiene un buen capítulo al respecto.

Planteamiento del problema

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, alguien que use 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 este ejercicio a la perfección. En lugar de usar ese crate, implementa tu propia solución; haz el intento por tu cuenta antes de mirar su código fuente.


Fuente

Peter Goodspeed-Niklaus
Editar en GitHub El enlace se abre en una ventana o una pestaña nuevas
Rust Exercism

¿Todo listo para empezar Macros?

Regístrate en Exercism para aprender y dominar Rust con 99 ejercicios y mentoría humana real, todo gratis.