问题标签 [rust-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 投票
1 回答
1847 浏览

macros - 如何在宏中匹配 Rust 的“if”表达式?

我正在尝试编写一个将重写某些 Rust 控制流的宏,但我很难匹配if表达式。问题是谓词是一个表达式,但expr不允许 an 后跟 a blockor {

我最好的方法是使用tt

这适用于单令牌或分组谓词:

但如果谓词未分组,则失败:

我还尝试tt在谓词中使用重复模式:

但这会产生一个错误,因为现在不清楚后续块是否也应该匹配tt

有没有办法做到这一点,还是我坚持发明特殊语法以在宏中使用?

0 投票
0 回答
813 浏览

enums - 如何使用宏生成可能包含或不包含关联值的枚举变体?

我正在尝试制作一个宏来定义一些代表汇编指令的枚举变体。

现在,我有以下工作正常。这是非常无用的,但最终我将添加一些自动派生的方法,以便稍后有目的:

问题是我要添加的大多数(但不是全部)变体都需要有关联的值:

我尝试使用它来允许变体具有关联值(它实际上还不支持关联值,这只是一个开始):

该代码给了我这个错误:

好像我不能在enum定义中使用宏。假设这是真的,我该如何解决这个问题并能够生成可能包含或不包含关联值的枚举变体?

注意:我确定我添加的规则有问题,但我至少希望能够达到我可以调用它们的地步,这样我就可以让它们工作。

编辑

mcarton 解释了另一种方法来做我想做的事情,目前这很有帮助。

但是我仍然想知道如何在枚举定义中使用宏,因为将来我可以像这样编写宏:

所以我有解决方法,但我仍然很好奇是否可以在enum定义中使用宏。这是可能的,如果不是,为什么不呢?

0 投票
2 回答
7588 浏览

rust - How do I create a proc_macro_attribute?

Now that proc_macros have been stabilized, how does one create such a thing?

From what I've seen, there's the option of putting a #[proc_macro_attribute] annotation on a fn whatsitsname(attrs: TokenStream, code: TokenStream) -> TokenStream, but how can I register it? How can I add custom attributes?

0 投票
1 回答
2275 浏览

rust - 是否可以在 Rust 的过程宏中存储​​状态?

是否可以构建一个不输出任何内容但存储状态以构建列表的宏,然后再构建一个实际使用该数据的第二个宏?

例如:

0 投票
1 回答
407 浏览

macros - 是否可以拥有一个同时具有程序宏和逻辑的板条箱?

当您想共享使用程序宏的库时,双箱方法foo/foo_derive不可避免吗?

我想提供一个具有逻辑宏的板条箱。我尝试的第一件事是:

my_proc_macro板条箱中,我尝试过,pub use my_crate::*;但禁止这样做:编译器拒绝构建它。

是否可以反过来这样做?我的意思是:将程序宏箱导入库中,然后重新导出宏?

0 投票
1 回答
298 浏览

macros - 为什么通过 `use some_crate::derive_foo` 导入自定义派生 Foo 不起作用?

我想使用一个使用属性的自定义派生宏。对于 Rust 2015,我写道:

使用edition = '2018',extern crate已弃用,因此macro_use不可用。我以为我会写use pest_derive::{grammar,derive_parser};,但我必须写use pest_derive::*;

如何避免全局导入?Pest_derive crate 的代码非常简单,我不知道有什么必要的东西*导入不是derive_parseror grammar

0 投票
1 回答
10289 浏览

rust - 如何编写自定义派生宏?

我正在尝试在 Rust 中编写自己的派生模式宏,并且它的文档在示例中有些缺乏。

我有一个像这样的结构:

我希望我的宏生成一个方法 à la

使用TokenStreamtrait 实现类似目标的基本步骤是什么?

0 投票
1 回答
195 浏览

rust - 如何将宏属性应用于单独模块中定义的函数?

我有兴趣使用wasm-bindgenviarust-webpack-template将 Rust 代码编译为 WebAssembly。但是,我想避免直接用#[wasm_bindgen]属性宏直接包装我的代码,以便我可以从生成的 WebAssembly 接口中分离出功能逻辑,以更好地组织我的项目。相反,我希望将绑定生成放在单独的文件中,例如:

我知道这#[wasm_bindgen]是一个宏属性,它在通常遵循的函数定义的 AST 上运行,但是有没有一种方法可以将该宏应用于其他地方定义的代码?

0 投票
1 回答
99 浏览

rust - 为什么我不能将捕获的令牌传递给嵌套宏?

我见过的多个例子表明这应该是可能的,但显然不是:

lib.rs

运行cargo test给出以下输出:

这很令人困惑,因为似乎有一条规则需要 token f32

这两个宏的扩展轨迹也有注释。第一个不起作用:

而第二个是:

为什么第一次扩展inner_macro!失败,而当它没有嵌套在另一个宏中时,完全相同的扩展成功?

编辑:如果我们手动执行替换,它会起作用并给出预期的输出:

0 投票
1 回答
818 浏览

rust - 在编译时计算一组常量表达式的最大值

我试图在编译时计算 Rust 过程宏(派生宏)内的一组常量的最大值。

宏看起来像:

问题是它std::cmp::max是一个函数,因此不能在常量表达式中使用(至少直到const fn稳定 - 如果可能的话,我想保持稳定的 Rust)。

如何在编译时计算一组常量的最大值?

我也许可以编写一个max!基本上以if递归方式构造一个巨大的 s 链的宏,但我希望那里有一个更清洁的解决方案。