问题标签 [rust-proc-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 - 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?
rust - 是否可以在 Rust 的过程宏中存储状态?
是否可以构建一个不输出任何内容但存储状态以构建列表的宏,然后再构建一个实际使用该数据的第二个宏?
例如:
rust - 实现 proc 宏时的循环包依赖
我尝试实现一个类似于 serdes 的Dump
proc_macro Serialize
。
为此,我有一个板条箱foo
,其中包含我的“原始”结构(P1
在P2
这种情况下),它应该只能是可转储的。
接下来我确实有一个foo_derive
包含程序宏本身的板条箱。
因为我想支持多种格式,所以我有第三个板条箱foo_dump
,其中包含Dump
(例如,可以转储此结构)和Dumper
(这是后端应该实现的东西)的特征定义。非常直截了当,直到这一点。
当我现在想编译它时,我得到了这个错误:
我不知道正确的方法是什么,如何在这个 crate 中使用依赖项。我现在的一个是:
这当然是不可能的。
我错过了什么?我该怎么做才能打破依赖圈?
( mcve@github )
/货物.toml
/foo/Cargo.toml
/foo/src/lib.rs
/foo_dump/Cargo.toml
/foo_dump/src/lib.rs
/foo_derive/Cargo.toml
/foo_derive/src/lib.rs
rust - 将字符串转换为 TokenStream
给定一个字符串 ( str
),如何TokenStream
在 Rust 中将其转换为 a?
我试过使用quote!
宏。
这里的目标是为一些未知的代码字符串生成令牌。
或者
rust - 无法调用类似函数的过程宏:无法扩展为语句
我试图让我的头脑围绕类似函数的过程宏并努力学习基础知识。
首先,我尝试创建一个只打印所有标记并且什么都不做的宏:
然后我尝试在另一个二进制文件中使用它:
当我这样做时,cargo build
我得到了这个:
它告诉我这无法编译,但println
在宏内部有效。怎么了?
问题 #54727非常广泛,我不确定它与此有何关系。
我正在使用 stable-i686-pc-windows-gnu、rustc 1.31.1 (b6c32da9b 2018-12-18)。
struct - 如何以编程方式获取结构的字段数?
我有一个自定义结构,如下所示:
是否可以通过编程方式获取结构字段的数量(例如,通过方法调用field_count()
):
对于这个结构:
...以下调用应返回1
:
是否有类似的 APIfield_count()
或者只能通过宏获得?
如果这可以通过宏实现,应该如何实现?
error-handling - 如何使用引用宏报告程序宏中的错误?
我正在编写一个运行良好的程序宏,但我无法以符合人体工程学的方式报告错误。使用panic!
“有效”但并不优雅,也不能很好地向用户显示错误消息。
我知道我可以在解析 a 时报告好的错误TokenStream
,但是在解析 AST 后我需要在遍历 AST 时产生错误。
宏调用如下所示:
并且应该输出:
这是宏代码:
bool
如果属性中没有指定任何内容,我想产生一个错误。例如,像这样输入:
应该导致类似:
在解析过程中,有 a Result
,其中包含很多有用的信息,包括 a span
,因此产生的错误可以突出显示有问题的宏调用的确切部分。但是一旦我遍历 AST,我就看不到报告错误的好方法。
这应该怎么做?
rust - 如何编写扩展为宏调用的过程宏,而不需要用户导入宏的 crate?
我正在尝试编写一个类似函数的过程宏my_macro
,该宏可以扩展为lazy_static
宏调用。my_macro
我想以一种用户不需要lazy_static
在其 crate 的依赖项中列出并明确使用它的方式编写它( use lazy_static::lazy_static
)。
这是最小的示例代码:
lib.rs (my_macro crate)
Cargo.toml (my_macro crate)
lib.rs(使用箱)
Cargo.toml(使用箱)
上面的代码导致编译错误:
我理解这个错误,我知道我可以通过让usage
crate 依赖它lazy_static
来解决它(见注释行)。use
lib.rs
问题是这意味着所有使用的 cratemy_macro
都必须lazy_static
在它们的依赖项中列出。这似乎不对,我想知道是否有替代方案。我已经尝试了几件事,但没有解决问题。
rust - 将枚举变体用作函数的这种奇怪语法是什么?
下面是.mod 的 mod 文档给出的示例syn::parse
。
是input.parse().map(Item::Struct)
有效的正常 Rust 语法(看起来不像Item::Struct
不是函数),还是一种特殊的proc_macro
库语法?如果是后者,是否有proc_macro
特定语法规则的文档?