macro_rules 是普通宏吗?

Is macro_rules a regular macro?

我正在尝试理解 Rust 宏语法。 Here 我读到通常可以以 3 种方式调用宏:

mymacro!(<tokens>);
mymacro![<tokens>];
mymacro!{<tokens>};

...然后我看到一个示例宏定义也使用宏 (macro_rules),但语法不符合这些规则:

macro_rules! name {<tokens>}

name 是一个标记,我们这里有第 4 种合法的宏调用形式,还是 macro_rules 是一个关键字,而不仅仅是宏,并且使用了常规宏不可用的特殊语法?

不,macro_rules是一个特殊的“指令”。您可以查看编译器语法树here。 重要的部分是:

Syntax
MacroRulesDefinition :
   macro_rules ! IDENTIFIER MacroRulesDef

可以看出是宏语法的入口