Возможно ли использовать "пространство имен" в макросах Rust?

Я писал много макросов в недавнем проекте. Я просто думал о том, как невероятно полезная система модулей Rust предназначена для управления "пространствами имен", и я начал задаваться вопросом:

  • Почему было решено, что макросы также не должны соблюдать модульную систему? Это из-за общей редкости использования макросов? Или из-за какого-то другого фундаментального процесса компиляции, который его ограничивает?

  • Возможно ли это для "пространства имен" макросов Rust?

Этот вопрос не возникает из-за крайней необходимости, но больше из общего любопытства: -)

Ответ 1

Макрорасширение выполняется до "модульной системы", и поэтому разрешение и поиск имен в действительности не установлены. Кроме того, макросы действительно могут создавать целые модули, поэтому не обязательно иметь всю систему разрешений. Это также связано с тем, что макросы запускаются в порядке объявления (единственное место в Rust, где это действительно имеет значение), так что существует предсказуемое упорядочение имен и макросов.

Итак, есть некоторые технические проблемы. Однако было бы очень приятно, по крайней мере, иметь некоторые формы макросов с именами.

Было бы возможно (и по существу необходимо) иметь пространство имен между ящиками, то есть, если ящики a и b определяют 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!().