1. 1. Introduction
  2. 2. 宏,彻底剖析
    1. 2.1. 语法扩展
      1. 2.1.1. 源码解析过程
      2. 2.1.2. AST中的宏
      3. 2.1.3. 展开
    2. 2.2. macro_rules!
    3. 2.3. 细枝末节
      1. 2.3.1. 再探捕获与展开
      2. 2.3.2. 卫生性
      3. 2.3.3. 不是标识符的标识符
      4. 2.3.4. 调试
      5. 2.3.5. 作用域
      6. 2.3.6. 导入/导出
  3. 3. 宏,实践介绍
  4. 4. 常用模式
    1. 4.1. 回调
    2. 4.2. 标记树撕咬机
    3. 4.3. 内用规则
    4. 4.4. 下推累积
    5. 4.5. 重复替代
    6. 4.6. 尾部分隔符
    7. 4.7. 标记树聚束
    8. 4.8. 可见性
    9. 4.9. 临时措施
  5. 5. 轮子
    1. 5.1. AST强转
    2. 5.2. 计数
    3. 5.3. 枚举解析
  6. 6. 实例注解
    1. 6.1. Ook!

AST强转

在替换tt时,Rust的解析器并不十分可靠。当它期望得到某类特定的语法构造时,如果摆在它面前的是一坨替换后的tt标记,就有可能出现问题。解析器常常直接选择死亡,而非尝试去解析它们。在这类情况中,就要用到AST强转。

macro_rules! as_expr { ($e:expr) => {$e} }
macro_rules! as_item { ($i:item) => {$i} }
macro_rules! as_pat  { ($p:pat) =>  {$p} }
macro_rules! as_stmt { ($s:stmt) => {$s} }Run

这些强制变换经常与下推累积宏一同使用,以使解析器能够将最终输出的tt序列当作某类特定的语法构造对待。

注意,之所以只有这几种强转宏,是因为决定可用强转类型的点在于宏可展开在哪些地方,而不是宏能够捕捉哪些东西。也就是说,因为宏没办法在·type处展开issue-27245,所以就没办法实现什么as_ty!强转。