15.1 Designators
매크로의 인자는 접두사로 달라 표시 $가 들어가고 지정자(designator)로 타입 주해된다.
macro_rules! create_function {
// 이 매크로는 지정자`ident`의 인수를 취하고
// `$func_name`으로 이름지어진 함수를 생성한다.
// `ident`지정자는 변수/함수 이름으로 사용된다.
($func_name:ident) => (
fn $func_name() {
// `stringify!`매크로가 `ident`를 string으로 변환한다.
println!("You called {:?}()",
stringify!($func_name))
}
)
}
// 상기 매크로를 통해 `foo`와 `bar`로 이름지어진 함수들을 생성한다.
create_function!(foo);
create_function!(bar);
macro_rules! print_result {
// 이 매크로는 `expr`타입의 표현식을 취해 결과와 함께 문자열로 출력한다.
// `expr`지정자가 표현식에 사용된다.
($expression:expr) => (
// `stringify!`는 표현식을 *있는 그대로* string으로 변환한다.
println!("{:?} = {:?}",
stringify!($expression),
$expression)
)
}
fn main() {
foo();
bar();
print_result!(1u32 + 1);
// 표현식이기도 한 블럭을 통해 다시 호출!
print_result!({
let x = 1u32;
x * x + 2 * x - 1
});
}다음 항목들은 모든 지정자들이다:
blockexpr은 표현식을 위해 사용된다.ident은 변수/함수 이름을 위해 사용된다.itempat(pattern)pathstmt(statement)tt(token tree)ty(type)