【问题标题】:Rust macro_rules nested repetitionRust 宏规则嵌套重复
【发布时间】:2020-04-05 15:53:07
【问题描述】:

在宏规则中!抄写员,嵌套重复没有正确处理。这工作正常:

macro_rules! demo_macro {
    ($op:tt; $($arg:tt),*) {
        ($($op * $arg),*)
    }
}

fn main() {
    println!("{?:}", demo_macro!(2; 1,2,3));
}

并输出(2, 4, 6),但这不会编译:

macro_rules! demo_macro {
    ([$($op:tt)*] $($arg:tt),*) {
        ($($($op)* $arg),*)
    }
}

fn main() {
    println!("{?:}", demo_macro!([2*] 1,2,3));
}

并导致此错误消息:

error: meta-variable `op` repeats 2 times, but `arg` repeats 3 times
 --> src/main.rs:3:11
  |
3 |         ($($($op)* $arg),*)
  |           ^^^^^^^^^^^^^^

如果我将 1,2,3 更改为 1,2 以使重复计数匹配,我会收到以下错误消息:

error: attempted to repeat an expression containing no syntax variables matched as repeating at this depth
 --> src/main.rs:3:13
  |
3 |         ($($($op)* $arg),*)
  |             ^^^^^

知道如何使demo_macro!([2*] 1,2,3) 产生(2, 4, 6) 吗?

【问题讨论】:

    标签: rust macros repeat


    【解决方案1】:

    是的,这行得通!

    macro_rules! unbracket {
        (_ [$($tt1:tt)*]) => { $($tt1)* };
        (() [$($tt1:tt)*]) => { ($($tt1)*) };
        ([] [$($tt1:tt)*]) => { [$($tt1)*] };
        ({} [$($tt1:tt)*]) => { {$($tt1)*} };
        ($tt0:tt [$($tt1:tt)*] @unbracket ($($tt2:tt)*) $($tt3:tt)*) => { unbracket!{ $tt0 [$($tt1)* $($tt2)*] $($tt3)*} };
        ($tt0:tt [$($tt1:tt)*] @unbracket [$($tt2:tt)*] $($tt3:tt)*) => { unbracket!{ $tt0 [$($tt1)* $($tt2)*] $($tt3)*} };
        ($tt0:tt [$($tt1:tt)*] @unbracket {$($tt2:tt)*} $($tt3:tt)*) => { unbracket!{ $tt0 [$($tt1)* $($tt2)*] $($tt3)*} };
        ($tt0:tt [$($tt1:tt)*] $tt2:tt $($tt3:tt)*) => { unbracket!{$tt0 [$($tt1)* $tt2] $($tt3)*} };
    }
    
    macro_rules! demo_macro {
        ($op:tt $($arg:tt),*) => {
            unbracket!(() [] $(@unbracket $op $arg),*)
        }
    }
    
    fn main() {
        println!("{:?}", demo_macro!([2*] 1,2,3));
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-17
      • 1970-01-01
      • 2020-11-29
      • 2015-08-10
      • 1970-01-01
      相关资源
      最近更新 更多