gpt4 book ai didi

macros - 如何编写捕获括号的宏参数?

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

我希望编写一个 Rust 宏,将其整个参数转发给第二个宏——即使该参数包含令人兴奋的括号。

这是我到目前为止尝试过的:

macro_rules! parse {
(done) => (println!("done!"));
(if ($cond:tt) {$then:tt}) => (println!("if! "); parse!($cond); parse($then));
}

macro_rules! forward {
($($e:tt)*) => (parse!($($e)*; done));
}

fn main() {
forward!(if (done) {done} );
}

这不起作用,并产生错误:

error: no rules expected the token `if`

我在这里做错了什么?

编辑:除了简单地将参数转发给forward,我还希望“粘贴”标记; doneforward 参数的末尾。有没有办法在保持这种行为的同时使这项工作有效?

最佳答案

问题出在;在 forward 中完成。这里发生的是宏扩展代码将文字输入标记一次一个地匹配到武器。如果一只 ARM 不匹配,它就会放弃并尝试下一只。当它用尽武器尝试时,它必须失败并解释原因。

但是输入中的哪个标记是问题所在?当可能涉及多个武器时很难回答这个问题,因此它只是选择第一个标记并说“这就是问题所在”。

每当您看到宏扩展提示输入中的第一个标记不匹配时,很可能是输入中后面的内容导致它出错。

修复它(并修复缺少 !parse 调用)给出:

macro_rules! parse {
(done) => (println!("done!"));
(if ($cond:tt) {$then:tt}) => (println!("if! "); parse!($cond); parse!($then));
}

macro_rules! forward {
($($e:tt)*) => (parse!($($e)*));
}

fn main() {
forward!(if (done) {done} );
}

关于macros - 如何编写捕获括号的宏参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49526522/

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