[英]How to separate last expression in repeated expressions in a Rust macro?
我想要這個宏:
macro_rules! macro1 {
($f1:expr, $($f2:expr),+, $f3:expr) => {
$f1(|a| {
$(
$f2(a, |b| {
$f3(a, b);
});
)*
});
}
}
然而,這local ambiguity when calling macro
錯誤: multiple parsing options: built-in NTs expr ('f3') or expr ('f2').
. 如果將宏規則中的最后一個,
替換為;
,我可以解決此錯誤。 相反,它清楚地將重復的f2
和最后一個f3
分開,但我想盡可能保留逗號以類似於 function。我也可以交換f2
和f3
,但在我的代碼中f2
往往很短,而f3
會很長,所以如果可能的話,我也想保留這個訂單。
有沒有其他方法可以寫這個宏來達到這個效果呢?
只有非常強大但難以理解的TT 咀嚼:
macro_rules! macro1 {
($f1:expr, $($f2_and_3:expr),+) => {
macro1! { @transpose $f1, [ ] $($f2_and_3),+ }
};
(@transpose $f1:expr, [ $($f2_parsed:expr,)* ] $f2:expr, $($f2_rest_and_3:expr),+ ) => {
macro1! { @transpose $f1, [ $($f2_parsed,)* $f2, ] $($f2_rest_and_3),+ }
};
(@transpose $f1:expr, [ $($f2:expr,)+ ] $f3:expr ) => {
$f1(|a| {
$(
$f2(a, |b| {
$f3(a, b);
});
)*
});
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.