はじめに
この実験では、Rust におけるドメイン固有言語 (DSL) の概念を探ります。これらの DSL は、Rust マクロに埋め込まれたミニ "言語" です。これらのマクロは通常の Rust 構文に展開されますが、特定の機能に対して簡潔で直感的な構文を提供します。実用的な例として、計算機 API を使って示します。ここでは、式をマクロに渡し、出力をコンソールに表示します。これにより、lazy_static や clap などのライブラリにあるような、より複雑なインターフェイスを作成できます。
注: 実験でファイル名が指定されていない場合は、好きなファイル名を使うことができます。たとえば、
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 でさらに多くの実験を行って、スキルを向上させることができます。