Les macros sont un élément puissant de la boîte à outils d'un programmeur Rust, et les macros par l'exemple sont un moyen relativement simple d'accéder à cette puissance. Écrivons-en une !
Qu'est-ce qu'une macro ? Wikipédia la décrit ainsi :
Une macro (abréviation de « macro-instruction », du grec μακρός « long ») est, en informatique, une règle ou un motif qui spécifie comment une séquence d'entrée donnée (souvent une séquence de caractères) doit être mise en correspondance avec une séquence de sortie de remplacement (elle aussi souvent une séquence de caractères) selon une procédure définie. Le processus de mise en correspondance qui instancie (transforme) un appel de macro en une séquence spécifique est appelé expansion de macro.
Éclairant ! Mais pour être plus concret, les macros sont une syntaxe spéciale qui permet de générer du code à la compilation. Les macros peuvent servir à des calculs à la compilation, mais le plus souvent elles ne sont qu'une autre façon d'abstraire le code. Par exemple, tu as probablement déjà utilisé println!() et vec![]. Chacune d'elles prend un nombre arbitraire d'arguments, ce qui fait qu'on ne peut pas les exprimer comme de simples fonctions. En revanche, elles se développent toujours en une certaine quantité de code Rust tout à fait standard. Si ça t'intéresse, tu peux utiliser la sous-commande cargo expand pour voir le résultat de l'expansion des macros dans ton code.
Pour plus d'informations sur les macros en Rust, le Rust Book y consacre un bon chapitre.
Tu peux produire un Vec de longueur arbitraire en une seule ligne grâce à la macro vec![]. En revanche, Rust ne fournit pas de moyen de produire un HashMap en une seule ligne. Remédie à cela en écrivant une macro hashmap!().
Par exemple, un utilisateur de ta bibliothèque pourrait écrire hashmap!('a' => 3, 'b' => 11, 'z' => 32). Cela devrait se développer en le code suivant :
{
let mut hm = HashMap::new();
hm.insert('a', 3);
hm.insert('b', 11);
hm.insert('z', 32);
hm
}
Note que la crate maplit fournit une macro qui résout parfaitement cet exercice. Implémente plutôt ta propre solution au lieu d'utiliser cette crate ; fais un essai par toi-même avant de regarder son code source.
Inscris-toi sur Exercism pour apprendre et maîtriser Rust avec 99 exercices, et un vrai mentorat humain, le tout gratuitement.