Macros 有没有可能;名称空间;生锈宏?

Macros 有没有可能;名称空间;生锈宏?,macros,module,rust,Macros,Module,Rust,我在最近的一个项目中写了很多宏。我在想Rust的模块系统在管理“名称空间”方面有多么有用,我开始怀疑: 为什么决定宏不应该也遵循模块系统?这是因为宏使用的普遍稀缺性吗?还是因为其他一些基本的编译过程限制了它 “名称空间”是否可能使宏生锈 这个问题并不是出于迫切的需要,而是出于一种普遍的好奇心:-)宏扩展在“模块系统”之前运行,因此此时并没有真正设置名称解析/搜索。此外,宏实际上可以创建整个模块,因此不一定能够使整个分辨率系统正常工作。这也是宏以声明顺序运行的部分原因(Rust中唯一一个真正重要的

我在最近的一个项目中写了很多宏。我在想Rust的模块系统在管理“名称空间”方面有多么有用,我开始怀疑:

  • 为什么决定宏不应该也遵循模块系统?这是因为宏使用的普遍稀缺性吗?还是因为其他一些基本的编译过程限制了它

  • “名称空间”是否可能使宏生锈


  • 这个问题并不是出于迫切的需要,而是出于一种普遍的好奇心:-)

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

    所以,这里有一些技术问题。不过,如果至少有某种形式的命名空间宏,那就太好了

    如果板条箱
    a
    b
    都定义了
    foo,那么在板条箱之间使用名称空间是完全可能的(而且基本上是必要的),则应能使以下内容合法化

    #![feature(phase)]
    
    #[phase(plugin)] extern crate a;
    #[phase(plugin)] extern crate b;
    
    fn main() {
        a::foo!();
        b::foo!();
    }
    

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

    “名称空间”是否可能使宏生锈


    总之:没有,除了通过C名称空间:
    mylib\u mymodule\u mymacro!()

    “名称空间”如何设置?如放入模块中,并作为“使用x”调用;福!(..)'? 您已经可以将宏放入子模块中,通过调用“use x;”有选择地导入宏要从模块x导出宏。@Doug-yeah,我指的是
    use x;福!(..)
    特别是。另外,我的印象是,使用宏的唯一方法是在包含宏的模块上使用
    #[macro_escape]
    ,这样就可以在整个板条箱中使用宏?你是说可以不使用
    #[macro_escape]
    ,而只使用常规的
    x
    而不是使
    x
    中的宏可用?编辑:(抱歉,之前意外单击了enter)。谢谢你。。。我收回。看起来我只是天真地使用了use x;假设它就是这样做的。你是对的,看起来一旦你加载了模块,它就会全局发布宏。“这还没有实现,但我们希望最终会有这种形式的东西。”你的意思是说宏将遵循普通项的所有常用名称空间机制,只是对调用它们有不同的板条箱限制(顺便说一句,模板Haskell)和
    宏导出
    会消失?或者是更小和/或不同的东西?(或者限制应该更细粒度,只有扩展到项目的宏才应该受到限制,或者类似的东西?)@glaebhoerl,我只是在谈论导出宏的板条箱级名称空间;在
    macro\u export
    之外使用板条箱内模块级名称空间会很好,但我不知道这是否可行。宏是功能门控的,可能适用于1.0,因此在1.0之后可以更改。(使用功能门就是选择一个不稳定的功能。)@glaebhoerl,内置宏不是功能门,应该有,以允许细粒度的每宏稳定。(我想,任何稳定的都会添加到前奏中。)目前,宏上不支持稳定性属性,但希望将来会支持。