Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

ドメイン固有言語(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

これは非常に単純な例でしたが、lazy_staticclap など、はるかに複雑なインターフェイスが 開発されています。

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