在 Rust 中是否可能编写一个创建其他宏的宏。例如,假设我定义了以下两个宏:
macro_rules! myprint(
($a:expr) => (print!("{}", $a))
)
macro_rules! myprintln(
($a:expr) => (println!("{}", $a))
)
由于这两个宏重复了很多代码,我可能想编写一个宏来生成这些宏。
我尝试生成这样的元宏。
#![feature(macro_rules)]
macro_rules! metamacro(
($i:ident) => (
macro_rules! $i (
($a:expr) => ({println!("hello {}", $a)})
)
);
)
metamacro!(foo)
fn main() {
foo!(1i);
}
但是遇到了以下错误:
<anon>:6:13: 6:14 error: unknown macro variable `a`
<anon>:6 ($a:expr) => ({println!("hello {}", $a)})
^
playpen: application terminated with error code 101
Program ended.
编辑:在进一步尝试宏后,我发现如果返回的宏没有接收到任何参数,则一个高阶宏会按预期工作。例如,以下代码。
#![feature(macro_rules)]
macro_rules! metamacro(
($i:ident) => (
macro_rules! $i (
() => ({println!("hello")})
)
);
)
metamacro!(foo)
fn main() {
foo!();
}
打印 hello