问题标签 [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.
debugging - 如何查看导致编译错误的扩展宏代码?
我有一个涉及宏的编译错误:
不幸的是,宏是递归的,所以很难弄清楚编译器在抱怨什么,而且行号似乎是针对扩展宏而不是我的代码的。
我怎样才能看到扩展的宏?是否有一个标志我可以传递给 rustc(甚至更好的货物)来转储它?
(这个宏来自rust-mdo,虽然我认为这并不重要。)
rust - 从父模块导入宏
我无法在 crate 中重复使用宏。
如果宏定义在./src/macros.rs
:
并用于./src/lib.rs
:
我看不到这个宏./src/submod/lib.rs
:
它产生错误消息error: macro undefined: 'my_macro!'
。
有没有办法可以在这个子模块中导入这个宏submod
?
rust - 将整个宏输入传递给另一个宏
我正在尝试制作一个简单的宏来调用vec!
它收到的任何内容,然后在返回新向量之前进行一些简单的处理:
问题是我的宏正在尝试解析语法,所以它抱怨逗号等。这是有道理的,但我不知道如何解决它。我认为这不是expr
正确的片段说明符。如何让它在vec!
不处理的情况下将原始输入传递给它?
syntax - Rust 声明性宏中的 @ 符号是什么意思?
我见过@
宏中使用的符号,但我在 Rust Book 或任何官方文档或博客文章中都找不到它的提及。例如,在这个 Stack Overflow 答案中,它是这样使用的:
从用法来看,它似乎用于声明另一个宏是主宏的本地宏。
这个符号是什么意思,为什么要使用它而不是创建另一个顶级宏?
rust - 在声明性宏中构建所有元素对(二次集)
我有一个标识符列表,我想为该列表中的每对标识符调用一个宏。例如,如果我有a
,b
和c
,我想生成这个:
当然,这是一个虚拟的例子。在我的真实代码中,标识符是类型,我想生成impl
块或类似的东西。
我的目标是只列出每个标识符一次。在我的真实代码中,我有大约 12 个标识符并且不想手动写下所有 12² = 144 对。所以我认为宏可能会帮助我。我知道它可以用所有强大的过程宏来解决,但我希望它也可以用声明性宏(macro_rules!
)来解决。
我尝试了我认为是处理这个问题的直观方法(两个嵌套的“循环”)(Playground):
但是,这会导致此错误:
我想这是有道理的,所以我尝试了其他东西(Playground):
但这会导致与上述相同的错误!
这完全可以使用声明性宏吗?
rust - 宏中的元组索引
我正在尝试在为特征实现生成签名的宏中索引数据元组,但有一些错误。我可以索引元组还是需要其他解决方案?破解tuple_index
我在谷歌找到的,但它对我不起作用。
编译错误:
string - 如何从声明性宏中返回新字符串?
所以我在这里,和 Rustlings 一起卡车,直到我在测试 4 中获得广泛支持。
它希望我编写一个满足以下代码的宏:
所以,我写了这个:
Rustlings 吐了出来:
哪个,你知道的。我明白了。我明白问题是什么,但我不明白如何编写一个满足代码的宏。我可以更改我正在测试的代码,但这不是测试要我做的。我只是写一个宏。我难住了。我也不明白将宏封装在模块中有何帮助,但测试表明这是对模块和宏的测试。
rust - 如何在 Rust 中对宏进行字符串化之前使其展开?
我正在尝试仅使用宏在 Rust 中编写一个 quine。为了做到这一点,我将main
函数嵌入到宏f1
中,并尝试嵌入f1
in f2
with的文字表示stringify!
。
到目前为止,这是我的代码:
不出所料,输出是:
我需要的是f1
在被字符串化之前进行扩展,以便程序能够运行。我怎样才能做到这一点?
rust - 如何解析 rust 宏中的单个标记
我开始使用 Rust 宏,我来尝试这个小练习示例。我想定义一个宏,该宏扩展为类型i32
(例如,但不是很重要)的变量初始化(名称无关紧要)和对该变量的一系列操作,在这种情况下为 avar += 1
或 avar -= 1
最后它将调用println!("{}", var)
. 该宏将采用一系列基于+
和-
匹配上述操作的标记。
例如:
将扩展为:
我决定为此使用 2 个宏,一个用于包装初始化和打印,另一个用于评估+-
令牌:
基础是:
助手将扩展操作:
这当然不起作用,编译失败并出现以下错误(Playground):
我有点卡住了。我知道自从我刚开始以来我可能会遗漏很多概念,我真的很感激能帮助我理解如何使用宏。先感谢您!
rust - 宏匹配令牌递归扩展
我正在尝试实现一个可以扩展brainfuck程序的宏(在从一些更简单的代码开始之后,我已经在提出解决方案时遇到了问题:How to parse single tokens in rust macros)。问题是在递归匹配的某个点它永远无法匹配结尾:
这是宏代码:
它基于自定义的扩展方法struct
。完整的代码编译问题可以在这个操场上重现
我对这种匹配不是很自信:
我认为这[$($t:tt)*] $($ts:tt)*
是为了匹配包含[]
在里面的任何标记的代码部分,然后是任何标记。但我不确定它是否应该工作。
我已经处理这个问题一段时间了,我完全被困住了。欢迎任何形式的帮助。提前致谢!