11

特定の Rust 制御フローを書き換えるマクロを作成しようとしていますが、if式を一致させるのに苦労しています。問題は、述語が式であることですが、 an の後に aまたはexprが続くことは許可されていません。block{

私が持っている最高のものは使用することttです:

macro_rules! branch {
    (
        if $pred:tt 
            $r1:block
        else
            $r2:block
    ) => {
        if $pred { 
            $r1
        } else {
            $r2
        }
    };
}

単一トークンまたはグループ化された述語でうまく機能します。

branch! {
    if (foo == bar) {
        1
    } else {
        2
    }
}

ただし、述語がグループ化されていない場合は失敗します。

branch! {
    if foo == bar {
        1
    } else {
        2
    }
}
error: no rules expected the token `==`

ttまた、述語での繰り返しパターンを使用しようとしました。

macro_rules! branch {
    (
        if $($pred:tt)+
            $r1:block
        else
            $r2:block
    ) => {
        if $($pred)+ { 
            $r1
        } else {
            $r2
        }
    };
}

ただし、後続のブロックも一致する必要があるかどうかがあいまいになるため、これはエラーを生成しますtt

error: local ambiguity: multiple parsing options: built-in NTs tt ('pred') or block ('r1').

これを行う方法はありますか、それともマクロで使用する特別な構文を発明することに行き詰まっていますか?

4

1 に答える 1