3 3 Оператор расширения имени

В языке есть оператор :: который позволяет обращаться к какому-то имени в пространстве других имён. Это похоже на такой же оператор в c++ но в Meta C это более мощный оператор.

Более подробно 4 2 Контракты и выбор#Оператор выбора

namespace

Пространство имён объявляется через символы ::

let a = 5;
::spaceOuter
{
    ::spaceInners
    {
        let a = 15; 
    }
    int a = 10;
}

::spaceOuter::spaceInnersVer2
{
    let a = 20;
}

print(a);  // 5
print(spaceOuter::a); // 10
print(spaceOuter::spaceInner::a);  // 15
print(spaceOuter::spaceInnersVer2) // 20

Можно перемещаться вверх по пространству имён.

print(spaceOuter::spaceInner::@::a);    // 10
print(spaceOuter::spaceInner::@::@::a); // 5
::a
{
    let v = 5;s
    ::b
    {
        let v = 10;
        fn output()
        {
            let v = 15;

            print(v);    // 15
            print(@::v); // 10
            print(@::@::v;) // 5
        }
    }
}

Обращение к глобальной области видимости.

print(@@::a) // 5
print(@@::spaceOuter::a); // 10
print(@@::spaceOuter::spaceInner::a); // 15

Парные скобки

Мы можем явно указать завершающую скобку.

::name_a
{

    ::name_b
    {
        let a;
    }/::name

}/::name_a

Парные пересекающиеся скобки

::#A
{
    let a;
::#B
{
    let b;
}/::#A
    let c;
}/::#B

a входит в A b входит в A B c входит в B

Это может быть использованно в сборке мусора и прочих штуках. Мы можем указать диапазон в котором работают умные указатели.

Время жизни переменной

let ::a = 10;

let ::b = 20;

print(a);
print(b);

/::a;

/::b;

Переменная a уничтожится в /::a;