在Rust中,是否可以在过程宏代码中调用宏?

5
举个例子,我在一个 impl 块上有一个过程宏属性,通常它处理方法:
#[my_proc_macro]
impl Foo {
  pub fn bar1() {}
  pub fn bar2() {}
}

现在,宏用户可能不想手动编写这些方法,而是希望调用一个宏来生成这些方法,例如:

#[my_proc_macro]
impl Foo {
  generate_methods!();
}

现在,my_proc_macro将使用宏调用的标记来进行处理,而不是使用宏调用结果的标记。

我的问题是:是否可以在my_proc_macro中展开generate_methods!(),并使用生成的方法?

1个回答

2

很遗憾,目前(Rust 1.44.1)不可能实现。

然而,这是一个已知问题已经有一段时间了。搜索术语是“eager macro expansion”。在2018年2月开始有 这个未解决的RFC

公开一个API以便过程宏可以选择急切地展开。这将会:

  • 允许过程和声明宏处理作为输入传递的未展开宏调用,
  • 允许宏访问自己构造的宏调用的结果,
  • 启用宏在当前禁止使用的语法中使用。

所以人们正在努力解决这个问题,但我不指望很快就能得到这个功能。毕竟这不是一个简单的问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接