问题标签 [rust-decl-macros]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
22974 浏览

debugging - 如何查看导致编译错误的扩展宏代码?

我有一个涉及宏的编译错误:

不幸的是,宏是递归的,所以很难弄清楚编译器在抱怨什么,而且行号似乎是针对扩展宏而不是我的代码的。

我怎样才能看到扩展的宏?是否有一个标志我可以传递给 rustc(甚至更好的货物)来转储它?

(这个宏来自rust-mdo,虽然我认为这并不重要。)

0 投票
1 回答
2475 浏览

rust - 从父模块导入宏

我无法在 crate 中重复使用宏。

如果宏定义在./src/macros.rs

并用于./src/lib.rs

我看不到这个宏./src/submod/lib.rs

它产生错误消息error: macro undefined: 'my_macro!'

有没有办法可以在这个子模块中导入这个宏submod

0 投票
1 回答
1071 浏览

rust - 将整个宏输入传递给另一个宏

我正在尝试制作一个简单的宏来调用vec!它收到的任何内容,然后在返回新向量之前进行一些简单的处理:

问题是我的宏正在尝试解析语法,所以它抱怨逗号等。这是有道理的,但我不知道如何解决它。我认为这不是expr正确的片段说明符。如何让它在vec!不处理的情况下将原始输入传递给它?

0 投票
1 回答
1458 浏览

syntax - Rust 声明性宏中的 @ 符号是什么意思?

我见过@宏中使用的符号,但我在 Rust Book 或任何官方文档或博客文章中都找不到它的提及。例如,在这个 Stack Overflow 答案中,它是这样使用的:

从用法来看,它似乎用于声明另一个宏是主宏的本地宏。

这个符号是什么意思,为什么要使用它而不是创建另一个顶级宏?

0 投票
1 回答
313 浏览

rust - 在声明性宏中构建所有元素对(二次集)

我有一个标识符列表,我想为该列表中的每对标识符调用一个宏。例如,如果我有a,bc,我想生成这个:

当然,这是一个虚拟的例子。在我的真实代码中,标识符是类型,我想生成impl块或类似的东西。

我的目标是只列出每个标识符一次。在我的真实代码中,我有大约 12 个标识符并且不想手动写下所有 12² = 144 对。所以我认为宏可能会帮助我。我知道它可以用所有强大的过程宏来解决,但我希望它也可以用声明性宏(macro_rules!)来解决。


我尝试了我认为是处理这个问题的直观方法(两个嵌套的“循环”)(Playground):

但是,这会导致此错误:

我想这是有道理的,所以我尝试了其他东西(Playground):

但这会导致与上述相同的错误!

这完全可以使用声明性宏吗?

0 投票
1 回答
1064 浏览

rust - 宏中的元组索引

我正在尝试在为特征实现生成签名的宏中索引数据元组,但有一些错误。我可以索引元组还是需要其他解决方案?破解tuple_index我在谷歌找到的,但它对我不起作用。

https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=7d4bc0f56c643cf4693279a9bd9db973

编译错误:

0 投票
1 回答
883 浏览

string - 如何从声明性宏中返回新字符串?

所以我在这里,和 Rustlings 一起卡车,直到我在测试 4 中获得广泛支持。

它希望我编写一个满足以下代码的宏:

所以,我写了这个:

Rustlings 吐了出来:

哪个,你知道的。我明白了。我明白问题是什么,但我不明白如何编写一个满足代码的宏。我可以更改我正在测试的代码,但这不是测试要我做的。我只是写一个宏。我难住了。我也不明白将宏封装在模块中有何帮助,但测试表明这是对模块和宏的测试。

0 投票
0 回答
245 浏览

rust - 如何在 Rust 中对宏进行字符串化之前使其展开?

我正在尝试仅使用宏在 Rust 中编写一个 quine。为了做到这一点,我将main函数嵌入到宏f1中,并尝试嵌入f1in f2with的文字表示stringify!

到目前为止,这是我的代码:

不出所料,输出是:

我需要的是f1在被字符串化之前进行扩展,以便程序能够运行。我怎样才能做到这一点?

0 投票
1 回答
795 浏览

rust - 如何解析 rust 宏中的单个标记

我开始使用 Rust 宏,我来尝试这个小练习示例。我想定义一个宏,该宏扩展为类型i32(例如,但不是很重要)的变量初始化(名称无关紧要)和对该变量的一系列操作,在这种情况下为 avar += 1或 avar -= 1最后它将调用println!("{}", var). 该宏将采用一系列基于+-匹配上述操作的标记。

例如:

将扩展为:

我决定为此使用 2 个宏,一个用于包装初始化和打印,另一个用于评估+-令牌:

基础是:

助手将扩展操作:

这当然不起作用,编译失败并出现以下错误(Playground):

我有点卡住了。我知道自从我刚开始以来我可能会遗漏很多概念,我真的很感激能帮助我理解如何使用宏。先感谢您!

0 投票
1 回答
532 浏览

rust - 宏匹配令牌递归扩展

我正在尝试实现一个可以扩展brainfuck程序的宏(在从一些更简单的代码开始之后,我已经在提出解决方案时遇到了问题:How to parse single tokens in rust macros)。问题是在递归匹配的某个点它永远无法匹配结尾:

这是宏代码:

它基于自定义的扩展方法struct。完整的代码编译问题可以在这个操场上重现

我对这种匹配不是很自信:

我认为这[$($t:tt)*] $($ts:tt)*是为了匹配包含[]在里面的任何标记的代码部分,然后是任何标记。但我不确定它是否应该工作。

我已经处理这个问题一段时间了,我完全被困住了。欢迎任何形式的帮助。提前致谢!