Пространства имен
TrustLang поддерживает пространства имен, разделителем в которых, как и в С++, выступает двойное двоеточие “::”.
Область имен может быть указана как для отдельного индетификатора, так и для целого блока кода.
В отличии от namespace в С++, области имен в NewLnag используются не только для организации кода в виде логических групп и с целью избежания конфликтов имен, но и для отнесения идентификатора, в котором явно указана область имен, к статическим объектам (память под которые выделяется на этапе комиляции программы).
Глобальное имя не может быть перекрыто макросом или локальной переменной при разрешении имен (name lookup). Создать глобальную (статическую) переменную в текущих пространствах имен без их перечисления, указав перед имененм переменную препроцессора @::.
Для использования пространства имен в блоке кода, его нужно указать перед открывающейся фигурной скобкой. В таком именованном блоке кода завершающие “::” указывать не обязательно.
⚠️ НЕ РЕАЛИЗОВАНО: префикс `@::` для глобальных статических переменных не реализован. Проверено: глобальный квалификатор `::var := N` работает, но вложенный блок-скоупинг `ns ( ... )` с доступом через `ns::var`/`::ns::var` в текущей версии НЕ работает так, как показано (объявленная внутри переменная не видна снаружи как ns::var)
::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; # Имя другой глобальной переменной (не может быть перекрыто)
};
};
Пространство имен, модули и пакеты
Пространство имен в TrustLang поддерживает одновременно с модульной структурой кода как в языках Java и Python и при указании полного имени объекта, программные модули и пространства имен можно объединять.
Например, полное имя переменой можно записать с указанием программного модуля \root\dir\module::ns::name::var,
где root и dir это каталоги в файловой системе относительно текущего модуля, а module — имя файла, т.е. root/dir/module.src.
Пространство имен и ООП
В TrustLang не применяется декорирование (манглинг) имен, основанный на типах аргументов функций.
Тем не менее, при создания уникальных идентификаторов для методов классов, TrustLang использует подход, похожий на применяемый в языке Python. При создании метода класса создается глобальная функция с именем класса и именем метода, объединенные через разделитель “::”.
Например, для класса :NewClass при создании метода method будет создана функция с именем NewClass::method.
Такая схема наименований методов полностью соответствует именованию функций в пространстве имен, и тем самым позволяет определять методы класса вне тела самого класса, просто указав нужное имя в пространстве имен или в явном виде.
⚠️ НЕ РЕАЛИЗОВАНО: данный синтаксис создания метода класса через блок пространства имён `NewClass:: ( ... )` и через полное имя `NewClass::method() := ...` не соответствует текущей реализации классов (см. docs/types/class)
Пример создания метода класса NewClass в области имен:
NewClass:: {
method() := { };
}
Пример создания метода класса NewClass с указанием полного имени:
NewClass::method() := { };