AST强转

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

  1. # #![allow(dead_code)]
  2. #
  3. macro_rules! as_expr { ($e:expr) => {$e} }
  4. macro_rules! as_item { ($i:item) => {$i} }
  5. macro_rules! as_pat { ($p:pat) => {$p} }
  6. macro_rules! as_stmt { ($s:stmt) => {$s} }
  7. #
  8. # as_item!{struct Dummy;}
  9. #
  10. # fn main() {
  11. # as_stmt!(let as_pat!(_) = as_expr!(42));
  12. # }

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

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