我是 Rust 的新手,甚至是宏引擎的新手,我正在尝试想出一种创建 DSL 的方法,用于 HTML 模板,如下所示,
h! {
foo(
"bar",
tag_with_parens(),
tag_without_parens,
"some other expression",
element(child),
),
"tags and strings can be siblings",
}
我玩弄了一下,但我不确定这是否可能
macro_rules! h {
// single idents and strings are matched here
($t:tt) => { h!($t(),) };
($t:tt( $($inner:tt),* )) => {h!($t($($inner),*),)};
($t:tt( $($inner:tt),* ), $($rest:tt),*) => {{
// recursion with the contents of the tag
h!($($inner),*);
// do something with the rest of the parameters
h!($($rest),*);
}};
}
在这个简单的示例中,我使用它是tt
因为它同时匹配标识符和字符串文字,但是当令牌后面跟括号时它会中断,因为我认为它认为它是一个单独的令牌。我明白了error: no rules expected the token (
。此外,如果我不仅要支持传递字符串,还要支持任何表达式,它必须有所不同
如果我让之前的事情起作用,我下一步要做的额外信用分配将是可选属性作为第一个参数。:)
h!(foo({ident="expr", bar}, "content"))