Makros

Makros

Schwer

Anleitung

Makros sind ein mächtiger Bestandteil des Werkzeugkastens eines Rust-Programmierers, und Makros by Example sind ein relativ einfacher Weg, auf diese Fähigkeiten zuzugreifen. Schreiben wir eines!

Kontext

Was ist ein Makro? Wikipedia beschreibt es so:

Ein Makro (kurz für „Makroinstruktion“, von griechisch μακρός ‚lang‘) ist in der Informatik eine Regel oder ein Muster, das festlegt, wie eine bestimmte Eingabesequenz (oft eine Zeichenfolge) nach einem definierten Verfahren auf eine ersetzende Ausgabesequenz (ebenfalls oft eine Zeichenfolge) abgebildet werden soll. Der Abbildungsprozess, der eine Makroverwendung in eine konkrete Sequenz instanziiert (umwandelt), wird als Makroexpansion bezeichnet.

Erhellend! Aber um es konkreter zu sagen: Makros sind eine besondere Syntax, mit der du Code zur Kompilierzeit erzeugen kannst. Makros lassen sich für Berechnungen zur Kompilierzeit nutzen, aber meist sind sie einfach eine weitere Möglichkeit, deinen Code zu abstrahieren. Zum Beispiel hast du sicher schon println!() und vec![] verwendet. Beide nehmen eine beliebige Anzahl von Argumenten entgegen, deshalb lassen sie sich nicht als einfache Funktionen ausdrücken. Andererseits expandieren sie immer zu einer bestimmten Menge absolut standardmäßigen Rust-Codes. Wenn du neugierig bist, kannst du den Unterbefehl cargo expand verwenden, um dir die Ergebnisse der Makroexpansion in deinem Code anzusehen.

Weitere Informationen zu Makros in Rust findest du in einem guten Kapitel im Rust Book.

Aufgabenstellung

Mit dem vec![]-Makro kannst du direkt einen Vec beliebiger Länge erzeugen. Rust bietet jedoch keine Möglichkeit, eine HashMap direkt zu erzeugen. Schaffe Abhilfe, indem du ein hashmap!()-Makro schreibst.

Ein Nutzer deiner Bibliothek könnte zum Beispiel hashmap!('a' => 3, 'b' => 11, 'z' => 32) schreiben. Das sollte zum folgenden Code expandieren:

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

Beachte, dass das maplit-Crate ein Makro bereitstellt, das diese Übung perfekt löst. Bitte implementiere deine eigene Lösung, anstatt dieses Crate zu verwenden; unternimm bitte zuerst einen eigenen Versuch, bevor du dir dessen Quellcode ansiehst.


Quelle

Peter Goodspeed-Niklaus
Über GitHub bearbeiten Der Link öffnet sich in einem neuen Fenster oder Tab
Rust Exercism

Bereit, mit Makros zu starten?

Melde dich bei Exercism an, um Rust mit 99 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.