【发布时间】:2020-10-19 23:01:19
【问题描述】:
在 L-System 表示法中,模式看起来像这样:
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,因为显然不允许使用括号。
【问题讨论】:
-
这里的
A(a)、A(x)和B(b, c)是否应该代表任意的 Rust 模式,就像您在match或if let表达式中可能发现的那样?还是它们实际上是一些更受限制的语法,恰好是pat可以匹配的子集?如果是后者,您可以编写一个 TT-muncher,将输入拆分为<和>,然后一举匹配。