Rust macro_rules嵌套重复

问题描述 投票:1回答:1

在macro_rules中!转录,嵌套重复处理不正确。效果很好:

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个回答
0
投票
是,这可行!

macro_rules! unbracket { (() [$($tt1:tt)*]) => { ($($tt1)*) }; ($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)); }

© www.soinside.com 2019 - 2024. All rights reserved.