도메인 특화 언어 (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 // 히히히 `eval`은 Rust 키워드가 아닙니다!
}
calculate! {
eval (1 + 2) * (3 / 4)
}
}
출력:
1 + 2 = 3
(1 + 2) * (3 / 4) = 0
이것은 매우 간단한 예제였지만, lazy_static이나 clap과 같이 훨씬 더 복잡한 인터페이스들이 개발되어 있습니다.
또한, 매크로에 두 쌍의 중괄호가 있음에 유의하세요. 바깥쪽 중괄호는 ()나 [] 외에 macro_rules! 문법의 일부입니다.