Domain Specific Languages (DSLs)
DSL - это мини язык, встроенный в макросы 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
.
Также обратите внимание на две пары скобок в макросе. Внешняя
пара является частью синтаксиса macro_rules!
, в
дополнение к ()
или []
.