在L-System符号化表示法中,一个模式看起来会像这样:
我正在尝试编写Rust宏来扩展它们。因此,我有以下内容:
但是我不能这样做。它显示的信息是:
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`
为什么这些在模式类型之后不允许?我可以匹配什么来得到这个结果?
我不能使用 tt
,因为括号在其中不被允许。
A(a)
,A(x)
, 和B(b, c)
是否代表 Rust 模式中可能出现的任意模式,就像在match
或if let
表达式中一样?还是它们实际上是一些更受限制的语法,只是恰好是pat
可以匹配的子集?如果是后者,您可以编写一个 TT-muncher,通过<
和>
将输入拆分,然后一次性匹配这些部分。 - trent