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

RustRustBeginner
Практиковаться сейчас

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.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL rust(("Rust")) -.-> rust/BasicConceptsGroup(["Basic Concepts"]) rust(("Rust")) -.-> rust/FunctionsandClosuresGroup(["Functions and Closures"]) rust/BasicConceptsGroup -.-> rust/variable_declarations("Variable Declarations") rust/FunctionsandClosuresGroup -.-> rust/function_syntax("Function Syntax") rust/FunctionsandClosuresGroup -.-> rust/expressions_statements("Expressions and Statements") subgraph Lab Skills rust/variable_declarations -.-> lab-99229{{"Доменные специфические языки "}} rust/function_syntax -.-> lab-99229{{"Доменные специфические языки "}} rust/expressions_statements -.-> lab-99229{{"Доменные специфические языки "}} end

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