Domain Specific Languages (ドメイン特化言語、DSLs) - Rust By Example
Description: Rust by Example (RBE) is a collection of runnable examples that illustrate various Rust concepts and standard libraries.

## 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

# Domain Specific Languages (ドメイン特化言語、DSLs)

ここで言う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_static`や`clap`のように、もっと複雑なインターフェースも開発されています。

また、マクロの中に2組の括弧があることにも注目してください。外側のは、`()`や`[]`に加え、`macro_rules!`の構文の一部です。