是否可以“命名”Rust宏?

时间:2014-07-17 04:19:22

标签: macros module rust

我在最近的一个项目中写了很多宏。我只想到Rust的模块系统用于管理"命名空间"是多么令人难以置信的有用,我开始怀疑:

  1. 为什么决定宏不应该遵守模块系统?是因为宏观使用普遍罕见吗?还是因为其他一些限制它的基本编译过程?

  2. 是否可以"命名空间" Rust宏?

  3. 这个问题不是出于迫切的需要,而是来自一般的好奇心: - )

1 个答案:

答案 0 :(得分:9)

宏扩展在"模块系统"之前运行,因此名称解析/搜索在该点没有真正设置。此外,宏实际上可以创建整个模块,因此不一定可能使整个分辨率系统工作。这也是宏以声明顺序运行的原因之一(Rust中唯一真正重要的地方),因此可以定义名称和宏的可预测顺序。

因此,存在一些技术问题。然而,至少有某种形式的命名空间宏,真的很好。

绝对有可能(并且基本上是必要的)在包装箱之间设置命名空间,也就是说,如果包装箱ab都定义foo!,那么以下应该能够合法化

#![feature(phase)]

#[phase(plugin)] extern crate a;
#[phase(plugin)] extern crate b;

fn main() {
    a::foo!();
    b::foo!();
}

这还没有实现,但我们希望最终会有这种形式。

  

是否可以"命名空间" Rust宏?

总结:不,除了通过C-namespacing:mylib_mymodule_mymacro!()