gpt4 book ai didi

macros - 如何递归地获取宏的最后一个参数?

转载 作者:行者123 更新时间:2023-11-29 08:27:22 27 4
gpt4 key购买 nike

使用如下例所示的简单递归宏,通常采用第一个参数,然后对其余参数进行 glob。

macro_rules! count_tts {
() => {0usize};
($_head:tt $($tail:tt)*) => {1usize + count_tts!($($tail)*)};
}

有没有办法递归地获取最后一个参数?

这使得可以:

类似($($head:tt)* $tail:tt) ...但这不起作用。

最佳答案

在宏解析器中没有“回溯”,所以你不能直接用 $($head:tt)* $tail:tt 来做。但是你可以通过自己反转来做到这一点。

macro_rules! concat_reverse {
([] $($reversed:tt)*) => {
concat!($(stringify!($reversed)),*) // base case
};
([$first:tt $($rest:tt)*] $($reversed:tt)*) => {
concat_reverse!([$($rest)*] $first $($reversed)*) // recursion
};
}

fn main() {
println!("{}", concat_reverse!([e d c b a]))
// output: abcde
}

宏跟踪看起来像:

   concat_reverse!([e d c b a])
== concat_reverse!([d c b a] e)
== concat_reverse!([c b a] d e)
== concat_reverse!([b a] c d e)
== concat_reverse!([a] b c d e)
== concat_reverse!([] a b c d e)
== concat!(stringify!(a), stringify!(b), stringify!(c), stringify!(d), stringify!(e))

您可以在递归阶段进行一些“映射”和“归约”操作(例如,用于计数)。

请注意,此方法会吃掉你的递归深度,你可能需要提高你的 #![recursion_limit="..."]

关于macros - 如何递归地获取宏的最后一个参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42171483/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com