Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Доменно-специфічні мови (DSLs)

DSL — це міні-“мова”, вбудована в макрос Rust. Це повністю коректний Rust, тому що система макросів розгортається у звичайні конструкції Rust, але це виглядає як маленька мова. Це дозволяє вам визначити лаконічний або інтуїтивний синтаксис для певної спеціальної функціональності (у межах можливого).

Припустімо, що я хочу визначити невеликий API калькулятора. Я хотів би передати вираз і мати виведений у консоль результат.

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

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

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

Вивід:

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

Це був дуже простий приклад, але було розроблено набагато складніші інтерфейси, такі як lazy_static або clap.

Також зверніть увагу на дві пари фігурних дужок у макросі. Зовнішні з них є частиною синтаксису macro_rules!, на додаток до () або [].