Einführung
In diesem Lab untersuchen wir das Konzept von Domain Specific Languages (DSLs) in Rust, die als kleine "Sprachen" in Rust-Makros eingebettet sind. Diese Makros erweitern sich zu normalen Rust-Konstrukten, bieten jedoch eine präzise und intuitive Syntax für spezifische Funktionen. Ein praktisches Beispiel wird anhand einer Taschenrechner-API demonstriert, bei der ein Ausdruck an das Makro übergeben wird und das Ergebnis auf der Konsole ausgegeben wird. Dies ermöglicht die Erstellung von komplexeren Schnittstellen wie denen in Bibliotheken wie lazy_static oder clap.
Hinweis: Wenn das Lab keinen Dateinamen angibt, können Sie einen beliebigen Dateinamen verwenden. Beispielsweise können Sie
main.rsverwenden und es mitrustc main.rs &&./mainkompilieren und ausführen.
Domain Specific Languages (DSLs)
Eine DSL ist eine kleine "Sprache", die in einem Rust-Makro eingebettet ist. Sie ist vollkommen gültiger Rust-Code, da das Makrosystem in normale Rust-Konstrukte expandiert, sieht aber wie eine kleine Sprache aus. Dies ermöglicht es Ihnen, eine präzise oder intuitive Syntax für bestimmte spezielle Funktionen (innerhalb der Grenzen) zu definieren.
Angenommen, ich möchte eine kleine Taschenrechner-API definieren. Ich möchte einen Ausdruck übergeben und das Ergebnis auf der Konsole ausgeben.
macro_rules! calculate {
(eval $e:expr) => {
{
let val: usize = $e; // Zwingt die Typen zu ganzen Zahlen
println!("{} = {}", stringify!{$e}, val);
}
};
}
fn main() {
calculate! {
eval 1 + 2 // hehehe `eval` ist _kein_ Rust-Schlüsselwort!
}
calculate! {
eval (1 + 2) * (3 / 4)
}
}
Ausgabe:
1 + 2 = 3
(1 + 2) * (3 / 4) = 0
Dies war ein sehr einfaches Beispiel.
Beachten Sie auch die zwei Paare von geschweiften Klammern im Makro. Die äußeren gehören zur Syntax von macro_rules! neben () oder [].
Zusammenfassung
Herzlichen Glückwunsch! Sie haben das Lab zu Domain Specific Languages (DSLs) abgeschlossen. Sie können in LabEx weitere Labs absolvieren, um Ihre Fähigkeiten zu verbessern.