ドメイン固有言語

RustRustBeginner
オンラインで実践に進む

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

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

この実験では、Rust におけるドメイン固有言語 (DSL) の概念を探ります。これらの DSL は、Rust マクロに埋め込まれたミニ "言語" です。これらのマクロは通常の Rust 構文に展開されますが、特定の機能に対して簡潔で直感的な構文を提供します。実用的な例として、計算機 API を使って示します。ここでは、式をマクロに渡し、出力をコンソールに表示します。これにより、lazy_staticclap などのライブラリにあるような、より複雑なインターフェイスを作成できます。

注: 実験でファイル名が指定されていない場合は、好きなファイル名を使うことができます。たとえば、main.rs を使って、rustc main.rs &&./main でコンパイルして実行することができます。

ドメイン固有言語 (DSL)

DSL は、Rust マクロに埋め込まれたミニ "言語" です。マクロシステムが通常の Rust 構文に展開されるため、完全に有効な Rust ですが、小さな言語のように見えます。これにより、いくつかの特殊な機能 (制限付き) に対して簡潔または直感的な構文を定義できます。

たとえば、小さな計算機 API を定義したいとします。式を提供して、出力をコンソールに表示したいと思います。

macro_rules! calculate {
    (eval $e:expr) => {
        {
            let val: usize = $e; // 型を整数に強制する
            println!("{} = {}", stringify!{$e}, val);
        }
    };
}

fn main() {
    calculate! {
        eval 1 + 2 // ヘヘヘ `eval` は Rust のキーワードではありません!
    }

    calculate! {
        eval (1 + 2) * (3 / 4)
    }
}

出力:

1 + 2 = 3
(1 + 2) * (3 / 4) = 0

これは非常に単純な例でした。

また、マクロ内の 2 組の波括弧にも注意してください。外側の波括弧は、()[] に加えて、macro_rules! の構文の一部です。

まとめ

おめでとうございます!ドメイン固有言語 (DSL) の実験を完了しました。LabEx でさらに多くの実験を行って、スキルを向上させることができます。