簡體   English   中英

如何分隔 Rust 宏中重復表達式中的最后一個表達式?

[英]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。我也可以交換f2f3 ,但在我的代碼中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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM