Domain Specific Languages

RustRustBeginner
Jetzt üben

This tutorial is from open-source community. Access the source code

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

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.rs verwenden und es mit rustc main.rs &&./main kompilieren 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.