我需要一个宏,它可以调用具有不同参数数量的函数,或者生成有效的参数列表的宏(重复参数)。我可以明确地向宏提供关于参数数量的信息,但是我无法生成函数的参数列表 - 我总是会在宏返回表达式而不是令牌树上遇到问题。我制作了以下playground示例: playground example。
编译器报错如下:
macro_rules! call (
($f: expr, $($params:tt)*) => {
$f(make_params!($($params:tt)*))
};
);
macro_rules! make_params {
() => {};
(I $($params: tt)*) => {
1, make_params!($($params:tt)*)
};
}
fn foo(a: i32, b: i32, c: i32) {
println!("foo: {} {} {}", a, b, c);
}
fn bar(a: i32, b: i32) {
println!("bar: {} {}", a, b);
}
fn main() {
call!(foo, I I I);
call!(bar, I I);
}
编译器报错如下:
error: macro expansion ignores token `,` and any following
--> src/main.rs:10:10
|
10 | 1, make_params!($($params:tt)*)
| ^
|
note: caused by the macro expansion here; the usage of `make_params!` is likely invalid in expression context
--> src/main.rs:3:12
|
3 | $f(make_params!($($params:tt)*))
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
...
如何将make_params!
的返回值视为令牌流(或类似)而不是表达式?
我的实际用例比这个玩具示例更复杂。我的函数有多个参数类型,这些类型以不同的方式构造。在我的情况下,仅制作宏call1
,call2!
等并不是一个好的解决方案,因为我需要像call_IIOOI
,call_IIIO
等这样的东西。
1, foo
不是一个有效的AST元素。 翻译注解: