Linguagens de Domínio Específico

Beginner

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

Introdução

Neste laboratório, exploramos o conceito de Linguagens de Domínio Específico (DSLs - Domain Specific Languages) em Rust, que são mini "linguagens" embutidas em macros Rust. Essas macros se expandem em construções Rust normais, mas oferecem uma sintaxe concisa e intuitiva para funcionalidades específicas. Um exemplo prático é demonstrado usando uma API de calculadora, onde uma expressão é fornecida à macro, e a saída é impressa no console. Isso permite a criação de interfaces mais complexas, como as encontradas em bibliotecas como lazy_static ou clap.

Nota: Se o laboratório não especificar um nome de arquivo, você pode usar qualquer nome de arquivo que desejar. Por exemplo, você pode usar main.rs, compilar e executá-lo com rustc main.rs && ./main.

Linguagens de Domínio Específico (DSLs)

Uma DSL é uma mini "linguagem" embutida em uma macro Rust. É Rust completamente válido porque o sistema de macros se expande em construções Rust normais, mas se parece com uma pequena linguagem. Isso permite que você defina uma sintaxe concisa ou intuitiva para alguma funcionalidade especial (dentro de limites).

Suponha que eu queira definir uma pequena API de calculadora. Eu gostaria de fornecer uma expressão e ter a saída impressa no console.

macro_rules! calculate {
    (eval $e:expr) => {
        {
            let val: usize = $e; // Force types to be integers
            println!("{} = {}", stringify!{$e}, val);
        }
    };
}

fn main() {
    calculate! {
        eval 1 + 2 // hehehe `eval` is _not_ a Rust keyword!
    }

    calculate! {
        eval (1 + 2) * (3 / 4)
    }
}

Saída:

1 + 2 = 3
(1 + 2) * (3 / 4) = 0

Este foi um exemplo muito simples.

Observe também os dois pares de chaves na macro. As externas fazem parte da sintaxe de macro_rules!, além de () ou [].

Resumo

Parabéns! Você concluiu o laboratório de Linguagens de Domínio Específico (DSLs). Você pode praticar mais laboratórios no LabEx para aprimorar suas habilidades.