问题标签 [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 回答
421 浏览

rust - 如何在过程宏中提供有用的编译器错误?

我正在使用proc_macro和设计一个自定义 HTML 语法解析器syn。一个样品:

尽管我知道Span在解析后如何使用错误,但我无法弄清楚如何在解析期间执行此操作。它只是与failed to parse anything. 如何查明解析失败的位置并给出适当的错误?

0 投票
1 回答
1451 浏览

rust - 如何评估 Rust 宏系统中的表达式?

我正在尝试通过编写一个简单的宏来学习 Rust 宏系统,该宏基于一些无符号整数类型 ( u8, u16, u32, u64) 生成一个结构。我想要这样的东西:

更具体地说,我正在寻找某种方法将某些信息存储在具有各种偏移量的无符号整数类型中。一个用例是读取一些字节并构造某种“消息”:

消息的上半部分包含一些数据/信息,下半部分是版本控制字段。(这只是一个玩具示例)。

到目前为止,这是我的努力,但内部重复扩展无法编译:

一种解决方案可能是将相关字节存储在结构中,直接(或使用特征)实现它以获取适当的字段,但这会涉及太多的位移逻辑(没问题,但必须有更多方便的方式)。

我知道bitflagsbitfield。它们都不符合我的用例。

0 投票
1 回答
333 浏览

rust - 打印!宏被乱序执行

我的部分代码如下所示:

我在这里期望的行为是这样的:

然而,发生的事情是这样的:

任何想法为什么会发生这种情况?AFAIK,编译器没有理由在这里更改执行顺序,这部分代码不是异步的,也不是多线程的。

0 投票
1 回答
201 浏览

rust - 创建混合递归宏以创建 HTML 模板 DSL

我是 Rust 的新手,甚至是宏引擎的新手,我正在尝试想出一种创建 DSL 的方法,用于 HTML 模板,如下所示,

我玩弄了一下,但我不确定这是否可能

在这个简单的示例中,我使用它是tt因为它同时匹配标识符和字符串文字,但是当令牌后面跟括号时它会中断,因为我认为它认为它是一个单独的令牌。我明白了error: no rules expected the token (。此外,如果我不仅要支持传递字符串,还要支持任何表达式,它必须有所不同

如果我让之前的事情起作用,我下一步要做的额外信用分配将是可选属性作为第一个参数。:)

0 投票
2 回答
2267 浏览

rust - 在 Rust 的宏中创建闭包环境

我正在尝试实现这样的目标(简化):

它不起作用,因为宏的参数atest在宏评估之前由编译器考虑:

有可能完成这项工作吗?我的理解是宏在编译之前被扩展。

0 投票
2 回答
900 浏览

rust - 创建宏以同时定义可变变量时的“预期标识符”

我想同时声明多个可变变量。定义了一个宏来声明可变变量,如下所示。

使用编译器进行语法检查时出错:

为什么我不能这样做macro_rules

0 投票
2 回答
480 浏览

macros - 为什么基于抽象语法树的宏优于基于字符串预处理的宏?

我开始了学习 Rust 的旅程。我在Rust by Example中遇到了这一行

但是,与 C 和其他语言中的宏不同,Rust 宏被扩展为抽象语法树,而不是字符串预处理,因此您不会遇到意外的优先级错误。

为什么抽象语法树比字符串预处理更好?

0 投票
2 回答
858 浏览

rust - 是否可以在纯 Rust 宏中编写像 `print!` 这样复杂的东西?

我开始学习 Rust 宏,但文档有些有限。这很好——我猜它们是一个专家功能。虽然我可以进行基本的代码生成、特征的实现等,但一些内置宏似乎远不止这些,例如各种打印宏,它们检查字符串文字并将其用于代码扩展。

我查看了源代码print!,它调用了另一个名为format_args. 不幸的是,这似乎不是在“纯 Rust”中构建的,评论只是说“编译器内置”。

是否可以编写像print!纯 Rust 宏一样复杂的东西?如果是这样,它会怎么做?

我实际上对构建“编译时树”很感兴趣——基本上将某些固定字符串识别为在编译时固定的“关键字”。这将是高性能的(可能),但主要是我只对代码生成感兴趣。

0 投票
1 回答
638 浏览

rust - 如何为特征的每个实现自动生成递增的数字标识符?

我有一个Component特征,它有一个返回索引的方法,如下所示:

这些索引用于设置位集中的标志。例如,Component返回索引 5 的特征对象将导致在容器中设置第 5 位。

目前我手动返回每个实现类型的运行索引:

特征对象被插入到一个容器中,该容器使用位集跟踪添加的组件:

这很好用,但是手动返回每个实现类型的索引很麻烦。我怎样才能让每个实现类型都能自动获取它的索引?

0 投票
2 回答
2560 浏览

rust - 是否可以扩展单个宏而不是整个文件?

我刚刚发现如何查看导致编译错误的扩展宏代码?. 是否可以扩展单个宏而不是整个文件?