As macros são uma parte poderosa do conjunto de ferramentas de um programador de Rust, e as macros por exemplo são uma forma relativamente simples de aceder a esse poder. Vamos escrever uma!
O que é uma macro? A Wikipédia descreve-a assim:
Uma macro (abreviatura de "macroinstruction", do grego μακρός, "longo") é, em informática, uma regra ou um padrão que especifica como uma determinada sequência de entrada (muitas vezes uma sequência de carateres) deve ser mapeada para uma sequência de saída de substituição (também muitas vezes uma sequência de carateres), de acordo com um procedimento definido. O processo de mapeamento que instancia (transforma) uma utilização de macro numa sequência específica é conhecido como expansão de macro.
Esclarecedor! Mas, para ser mais concreto, as macros são uma sintaxe especial que te permite gerar código em tempo de compilação. As macros podem ser usadas para cálculos em tempo de compilação, mas, mais frequentemente, são apenas outra forma de abstrair o teu código. Por exemplo, já deves ter usado println!() e vec![]. Cada uma delas aceita um número arbitrário de argumentos, por isso não as podes expressar como funções simples. Por outro lado, expandem-se sempre para uma certa quantidade de código Rust absolutamente padrão. Se estiveres interessado, podes usar o subcomando cargo expand para ver os resultados da expansão de macros no teu código.
Para mais informações sobre macros em Rust, o Rust Book tem um bom capítulo sobre elas.
Podes produzir um Vec de comprimento arbitrário em linha com a macro vec![]. No entanto, o Rust não vem com uma forma de produzir um HashMap em linha. Corrige isto escrevendo uma macro hashmap!().
Por exemplo, um utilizador da tua biblioteca pode escrever hashmap!('a' => 3, 'b' => 11, 'z' => 32). Isto deve expandir-se para o seguinte código:
{
let mut hm = HashMap::new();
hm.insert('a', 3);
hm.insert('b', 11);
hm.insert('z', 32);
hm
}
Repara que o crate maplit fornece uma macro que resolve este exercício na perfeição. Implementa antes a tua própria solução em vez de usar este crate; faz uma tentativa por ti antes de ver o código-fonte.
Inscreve-te no Exercism para aprenderes e dominares Rust com 99 exercícios, e mentoria humana real, tudo grátis.