Введение
В этом лабораторном задании мы исследуем концепцию доменных специфических языков (DSL) на Rust, которые представляют собой мини-"языки", встроенные в макросы Rust. Эти макросы расширяются в обычные конструкции Rust, но предлагают простой и интуитивный синтаксис для определенной функциональности. В качестве практического примера демонстрируется использование API калькулятора, где выражение передается в макрос, а результат выводится на консоль. Это позволяет создавать более сложные интерфейсы, подобные тем, которые можно встретить в библиотеках, таких как lazy_static или clap.
Примечание: Если лабораторное задание не задает имя файла, вы можете использовать любое имя, которое хотите. Например, вы можете использовать
main.rs, скомпилировать и запустить его с помощьюrustc main.rs &&./main.
Доменные специфические языки (DSL)
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 // hehehe `eval` не является ключевым словом Rust!
}
calculate! {
eval (1 + 2) * (3 / 4)
}
}
Вывод:
1 + 2 = 3
(1 + 2) * (3 / 4) = 0
Это был очень простой пример.
Также обратите внимание на две пары фигурных скобок в макросе. Внешние являются частью синтаксиса macro_rules!, помимо () или [].
Резюме
Поздравляем! Вы завершили лабораторную работу по доменным специфическим языкам (DSL). Вы можете практиковаться в более многих лабораторных работах в LabEx, чтобы улучшить свои навыки.