Пространства имен
NewLang поддерживает пространства имен, разделителем в которых, как и в С++, выступает двойное двоеточие “::”.
Область имен может быть указана как для отдельного индетификатора, так и для целого блока кода.
В отличии от namespace в С++, области имен в NewLnag используются не только для организации кода в виде логических групп и с целью избежания конфликтов имен, но и для отнесения идентификатора, в котором явно указана область имен, к статическим объектам (память под которые выделяется на этапе комиляции программы).
Глобальное имя не может быть перекрыто макросом или локальной переменной при разрешении имен (name lookup). Создать глобальную (статическую) переменную в текущем пространстве имен можно указав переменную препроцессора @::.
Для использования пространства имен в блоке кода, его нужно указать перед открывающейся фигурной скобкой. В таком именованном блоке кода завершающие “::” указывать не обязательно.
::var ::= 0; # Имя глобальной переменной в явном виде (не может быть перекрыто)
ns { # Можно указать равнозначное ns::
var ::= 0; # Имя ns::var (может быть перекрыто макросом или локальной переменной)
@::var ::= 0; # Имя глобальной переменной ::ns::var (не может быть перекрыто)
name:: {
var = 0; # Обращение к переменной ns::var
var2 ::= 0; # Имя переменной будет ns::name::var2
::var = 1; # Переменная из глобального пространства имен
};
:: { # Глобальное пространство имен
var = 1; # Имя глобальной переменной ::var (может быть перекрыто)
::ns::var = 0; # Имя другой глобальной переменной (не может быть перекрыто)
};
};
Пространство имен, модули и пакеты
Пространство имен в NewLang поддерживает одновременно с модульной структурой кода как в языках Java и Python и при указании полного имени объекта, программные модули и пространства имен можно объединять.
Например, полное имя переменой можно записать с указанием программного модуля \root\dir\module::ns::name::var
,
где root и dir это каталоги в файловой системе относительно текущего модуля, а module — имя файла, т.е. root/dir/module.nlp.
Пространство имен и ООП
В NewLang не применяется декорирование (манглинг) имен, основанный на типах аргументов функций.
Тем не менее при создания уникальных идентификаторов для методов классов NewLang использует подход, похожий на применяемый в языке Python. При создании метода класса создается глобальная функция с именем класса и именем метода, объединенные через разделитель “::”.
Например, для класса :NewClass
при создании метода method
будет создана функция с именем NewClass::method
.
Такая схема наименований методов полностью соответствует именованию функций в пространстве имен, и тем самым позволяет определять методы класса вне тела самого класса, просто указав нужное имя в пространстве имен или в явном виде.
Пример создания метода класса NewClass в области имен:
NewClass:: {
method() := { };
}
Пример создания метода класса NewClass с указанием полного имени:
NewClass::method() := { };