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

DSLとはRustマクロに埋め込まれた小さな「言語」のことです。 マクロ機能は通常のRustのプログラムへと展開されるので、これは完全に正当なRustなのですが、まるで小さな言語であるかのように見えます。 これにより、(一定の条件のもとで)なんらかの特定の機能のための簡潔・直感的な構文を定義することができるようになります。

ちょっとした計算機APIを定義したいとしましょう。 式を与えると、出力がコンソールに書き出されるようにしたいです。

macro_rules! calculate {
    (eval $e:expr) => {{
        {
            let val: usize = $e; // Force types to be integers
                                 // 型を整数に制約
            println!("{} = {}", stringify!{$e}, val);
        }
    }};
}

fn main() {
    calculate! {
        eval 1 + 2 // hehehe `eval` is _not_ a Rust keyword!
                   // `eval`はRustのキーワード *じゃない* よね!
    }

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

出力はこうなります:

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

これはとても単純な例ですが、lazy_staticclapのように、もっと複雑なインターフェースも開発されています。

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

関連キーワード:  関数, Result, エラー, eval, テストケース, Option, map, rules, macro, 定義