Macros

Macros

Difícil

Instruções

Macros são uma parte poderosa do kit de ferramentas de quem programa em Rust, e macros por exemplo são uma forma relativamente simples de acessar esse poder. Vamos escrever uma!

Contexto

O que é uma macro? A Wikipédia descreve assim:

Uma macro (abreviação de "macroinstruction", do grego μακρός, "longo") em ciência da computação é uma regra ou padrão que especifica como uma determinada sequência de entrada (muitas vezes uma sequência de caracteres) deve ser mapeada para uma sequência de saída de substituição (também muitas vezes uma sequência de caracteres) de acordo com um procedimento definido. O processo de mapeamento que instancia (transforma) um uso de macro em uma sequência específica é conhecido como expansão de macro.

Esclarecedor! Mas, para ser mais concreto, macros são uma sintaxe especial que permite gerar código em tempo de compilação. Macros podem ser usadas para cálculo em tempo de compilação, mas com mais frequência são apenas mais uma forma de abstrair seu código. Por exemplo, você provavelmente já usou println!() e vec![]. Cada uma delas recebe um número arbitrário de argumentos, então você não consegue expressá-las como funções simples. Por outro lado, elas sempre se expandem para uma certa quantidade de código Rust absolutamente padrão. Se você tiver interesse, pode usar o subcomando cargo expand para ver os resultados da expansão de macros no seu código.

Para mais informações sobre macros em Rust, o Rust Book tem um bom capítulo sobre elas.

Enunciado do problema

Você pode produzir um Vec de comprimento arbitrário inline usando a macro vec![]. No entanto, o Rust não vem com uma forma de produzir um HashMap inline. Resolva isso escrevendo uma macro hashmap!().

Por exemplo, quem usar a sua biblioteca pode escrever hashmap!('a' => 3, 'b' => 11, 'z' => 32). Isso deve se expandir para o seguinte código:

{
   let mut hm = HashMap::new();
   hm.insert('a', 3);
   hm.insert('b', 11);
   hm.insert('z', 32);
   hm
}

Repare que o crate maplit fornece uma macro que resolve este exercício perfeitamente. Implemente a sua própria solução em vez de usar esse crate; tente resolver por conta própria antes de olhar o código-fonte dele.


Fonte

Peter Goodspeed-Niklaus
Editar via GitHub O link abre em uma nova janela ou aba
Rust Exercism

Tudo pronto para começar Macros?

Crie sua conta no Exercism para aprender e dominar Rust com 99 exercícios e mentoria humana de verdade, tudo de graça.