领域特定语言 (DSL)
DSL 是一种嵌入在 Rust 宏中的小型“语言”。它完全是有效的 Rust 代码,因为宏系统会将其扩展为普通的 Rust 结构,但它看起来像一种小型语言。这允许您为某些特殊功能定义简洁或直观的语法(在一定范围内)。
假设我想定义一个小的计算器 API。我希望提供一个表达式并将输出打印到控制台。
macro_rules! calculate { (eval $e:expr) => { { let val: usize = $e; // Force types to be unsigned integers println!("{} = {}", stringify!{$e}, val); } }; } fn main() { calculate! { eval 1 + 2 // hehehe `eval` is _not_ a Rust keyword! } calculate! { eval (1 + 2) * (3 / 4) } }
输出
1 + 2 = 3
(1 + 2) * (3 / 4) = 0
这是一个非常简单的例子,但已经开发了更复杂的接口,例如 lazy_static
或 clap
。
另外,请注意宏中的两对大括号。外部的一对是 macro_rules!
语法的一部分,此外还有 ()
或 []
。