Macro

Macro

Difficile

Istruzioni

Le macro sono una parte potente della cassetta degli attrezzi di un programmatore Rust, e le macro by example sono un modo relativamente semplice per accedere a questa potenza. Scriviamone una!

Contesto

Che cos'è una macro? Wikipedia la descrive così:

Una macro (abbreviazione di «macroistruzione», dal greco μακρός «lungo») in informatica è una regola o un modello che specifica come una certa sequenza di input (spesso una sequenza di caratteri) debba essere mappata su una sequenza di output sostitutiva (anch'essa spesso una sequenza di caratteri) secondo una procedura definita. Il processo di mappatura che istanzia (trasforma) un uso di una macro in una sequenza specifica è noto come espansione della macro.

Illuminante! Ma per essere più concreti, le macro sono una sintassi speciale che permette di generare codice a tempo di compilazione. Le macro possono essere usate per calcoli a tempo di compilazione, ma più spesso sono solo un altro modo per astrarre il codice. Per esempio, probabilmente hai già usato println!() e vec![]. Ognuna accetta un numero arbitrario di argomenti, quindi non puoi esprimerle come semplici funzioni. D'altra parte, si espandono sempre in una certa quantità di codice Rust assolutamente standard. Se ti interessa, puoi usare il sottocomando cargo expand per vedere i risultati dell'espansione delle macro nel codice.

Per maggiori informazioni sulle macro in Rust, The Rust Book ha un buon capitolo al riguardo.

Enunciato del problema

Puoi produrre un Vec di lunghezza arbitraria inline usando la macro vec![]. Tuttavia, Rust non offre un modo per produrre una HashMap inline. Rimedia scrivendo una macro hashmap!().

Per esempio, chi usa la libreria potrebbe scrivere hashmap!('a' => 3, 'b' => 11, 'z' => 32). Questo dovrebbe espandersi nel seguente codice:

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

Nota che il crate maplit fornisce una macro che risolve perfettamente questo esercizio. Per favore, implementa una soluzione autonoma invece di usare questo crate; prova a fare un tentativo da solo prima di guardarne il codice sorgente.


Fonte

Peter Goodspeed-Niklaus
Modifica tramite GitHub Il link si apre in una nuova finestra o scheda
Rust Exercism

Vuoi iniziare Macro?

Iscriviti a Exercism per imparare e padroneggiare Rust con 99 esercizi e il mentoring di persone reali, tutto gratis.