gpt4 book ai didi

rust - 为什么不能使用rust macro_rules! pat 后面跟着 "<"?

转载 作者:行者123 更新时间:2023-12-03 11:27:54 24 4
gpt4 key购买 nike

在 L 系统表示法中,模式看起来像这样:

A(a)<A(x)>B(b, c) if a+b+c < 10 => B(a+b, a+c)A(x+a+b+c)

我正在尝试编写 Rust 宏来扩展它们。所以我有这样的东西:

macro_rules! test {
($lc:pat < $a:pat > $rc:pat) => { ... };
}

但它不会让我。它说:

error: `$a:pat` is followed by `>`, which is not allowed for `pat` fragments
--> src/main.rs:7:23
|
7 | ($lc:pat < $a:pat > $rc:pat) => { log_syntax!($lc); log_syntax!($a); log_syntax!($rc); };
| ^ not allowed after `pat` fragments
|
= note: allowed there are: `=>`, `,`, `=`, `|`, `if` or `in`

为什么 pat 类型后不允许这些?我可以匹配什么来获得这个?

我不能使用 tt 因为显然不允许使用括号。

最佳答案

token 被送入 macro_rules Rust 词法分析器发出了宏;作为 Rust 解析器一部分的相同词法分析器。词法分析器允许许多不是有效 Rust 的标记序列,当解析正常的 Rust 代码时,它们会被管道中的语法规则捕获。然而,词法分析器知道某种程度的上下文,例如它可以区分像 << 这样的东西。 (左移运算符)来自 << (嵌套类型参数的开始),取决于它是处理类型还是表达式。

在许多情况下,宏可以匹配不是有效 Rust 的标记流,但是实现会犯错误,因为要小心禁止词法分析器可能乐于发出的许多组合。这样做的原因是允许语言开发人员有一定的灵 active 来做一些事情,比如在不破坏现有宏的情况下添加新语法。这条线可能看起来相当随意,部分原因在于历史——语言是如何发展的以及人们早期发布的宏——但这条线必须在某个地方划定。

我们保证在摄取有效 Rust 代码(以及许多摄取无效 Rust 代码)的宏中具有前向兼容性,但代价是不允许很多创造性的应用程序。随着语言和编译器变得越来越稳定,规则可能会随着时间的推移逐渐放宽,但我想这会慢慢发生,如果有的话。

您的宏匹配无效的输入 Rust:模式永远不会出现在 < 之间和 > .不幸的是,它在宏中也是不允许的,您可能不得不选择不同的语法。

过程宏的限制较少,也可以作为一种选择。

关于rust - 为什么不能使用rust macro_rules! pat 后面跟着 "<"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64436176/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com