rust - Rust宏: What is the difference between braced and parenthesized macro bodies?

标签 rust macros

Afaik,Rust中的宏通过以下语法声明:

macro_rules! <name> {
    (<pattern>) => {
        <implementation>
    };
}

但是我发现了一个版本,其中主体用括号括起来,而不是Rust by Example中的花括号:
macro_rules! <name> {
    (<pattern>) => (
        <implementation>
    )
}

还请注意缺少的尾随分号。我最好的猜测是,这与该宏使用的尾部递归有关,但是括号内的宏主体与括号内的宏主体之间的正式区别是什么?

最佳答案

macro_rules中的分支只需用;分隔即可。尾随分号是可选的。在macro_rulesformal grammar中,此描述为

MacroRules :
   MacroRule ( ; MacroRule )* ;?

此处的语法类似于正则表达式。规则列表至少是一个规则,其后是任意数量的分号-jitt_code对。所有这一切之后是可选的分号。

实际上,这里的MacroRule(){}的选择完全无关紧要。这三种都是解析 [] 的公认方法

DelimTokenTree :
     ( TokenTree* )
   | [ TokenTree* ]
   | { TokenTree* }

这意味着无论DelimTokenTreeDelimTokenTree()还是[]包围,它的解析方式都是相同的。

特别是,您链接的宏与带有括号和尾部分号的all six combinations相同。

关于rust - Rust宏: What is the difference between braced and parenthesized macro bodies?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61969531/

相关文章:

macros - 如何测试宏中的标识符是否以下划线开头?

c - 全局变量、可重入代码和线程安全

c++ - C++ 中优雅的函数定义

c++ - 我怎样才能只写一次 "#include"?

rust - 如何在 Rust 中 fork/exec 转发所有参数的进程?

loops - 在Rust中进行迭代和操作的最佳/理想方式是什么

graphics - 如何更新 gfx-rs 中的索引缓冲区?

c++ - Rust 是否像 C++ 一样在索引时隐式创建映射条目?

macros - 我可以制作一个 clojure 宏来获取该宏创建的所有函数的列表吗?

rust - Diesel 是否支持 Postgres `point` 类型?