Доменные специфические языки

Beginner

This tutorial is from open-source community. Access the source code

Введение

В этом лабораторном задании мы исследуем концепцию доменных специфических языков (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, чтобы улучшить свои навыки.