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!
の構文の一部です。