Ответ 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!()
.