Руководство разработчика

Именованные константы

Чтобы локализовать в исходном тексте то или иное часто используемое значение с одним смыслом, применяются именованные константы. Использование именованных констант позволяет проще изменять исходные тексты, избегая поиска значений по всему тексту. Использование констант не приводит к дополнительным расходам времени на этапе выполнения программы, что делает их применение более привлекательным по сравнению с хранением постоянных значений в переменных. Значение именованной константы подставляется в код точно так же, как если бы значение было указано явно.

В соответствии с видимостью имен, именованные константы делятся на глобальные и локальные. Глобальные константы объявляются вне объявления типа и тела функции или метода. Локальные константы объявляются в теле функции или метода и доступны только от места объявления до конца функции.

Объявление осуществляется с помощью ключевого слова КОНСТ. После него указывается имя константы, знак равенства и константное выражение, определяющее значение константы. Перед именем константы может явно указываться имя типа - для тех случаев, когда тип не определяется из выражения или определяется неоднозначно.

Если тип константы указан явно, то он должен в точности соответствовать типу значения константы, т.к. никаких преобразований на этапе компиляции не выполняется. Исключение из этого правила составляют типы ЦЕЛОЕ и ЧИСЛО, для которых выполняется автоматическое преобразование, если значение находится в допустимом диапазоне (при преобразовании из вещественного числа в целое).

Синтаксис:

Глобальные константы:

КОНСТ <имя> = <константное выражение>;

или

КОНСТ <имя типа>: <имя> = <константное выражение>;

или для констант контейнерного типа:

КОНСТ <тип элемента>: <имя>[<список типов индеков>] = <константное выражение>;
Локальные константы:
КОНСТ <имя> = <константное выражение>

или

КОНСТ <имя типа>: <имя> = <константное выражение>

или для констант контейнерного типа:

КОНСТ <тип элемента>: <имя>[<список типов индеков>] = <константное выражение>

Объявление глобальной константы обязано заканчиваться точкой с запятой. Для локальных констант такого требования нет, но и наличие точки с запятой ошибкой не является.

Именованные константы могут также объявляться модулями.

Примеры

КОНСТ пи = 3.14;         // правильно: значение - константа
КОНСТ два_пи = 2*пи;     // правильно: значение - константное выражение
КОНСТ пи2 = Квадрат(пи); // ошибка: неконстантное выражение
КОНСТ макс = 10000000    // ошибка: нет точки с запятой

// явно указывается тип вещественной константы, 
// т.к. справа указано целочисленное значение
КОНСТ ЧИСЛО: две_целых_ноль_десятых = 2;    // 2.0 

// специальный синтаксис для константы контейнерного типа
КОНСТ СТРОКА: врeмена_года[] = (1: "Зима", 2: "Весна", 3: "Лето", 4: "Осень"); 

ВЫЧИСЛИТЬ
  КОНСТ пр_ст = 15% // правильно: значение - константное выражение
  КОНСТ сто = 100;  // правильно: допускается точка с запятой 
КОНЕЦ

При использовании объектных констант можно явно обращаться к полям объекта. В этом случае в качестве значения константы подставится значение указанного поля.

При использовании контейнерных констант можно явно обращаться к элементам контейнера по значениям индекса. Элемент контейнера с указанными значениями индексов должен существовать. Если указанные значения индексов - константные выражения, то получение элемента и ошибка, в случае его отсутствия, происходит на этапе компиляции. Когда в значениях индексов есть неконстантные выражения, то поиск элемента и возможная ошибка происходят на этапе выполнения программы.

Примеры

// объявляем объектный тип "Человек"
ТИП Человек
[
  СТРОКА: имя;
  ЦЕЛОЕ: возраст;
  ЦЕЛОЕ: дети[СТРОКА]; // возраста детей
]

// объявляем константу типа "Человек"
КОНСТ ч1 = Человек[имя = "Иванов", возраст = 40, дети=("Маша": 10, "Даша": 5)];
// или так
КОНСТ Человек: ч2 = [имя = "Петров", возраст = 21 ];

ВЫЧИСЛИТЬ
  КОНСТ а = ч1                // "а" принимает значение объектной константы со всеми ее полями
  КОНСТ б = ч1.имя            // обращение к полю объектной константы; б = "Иванов"
  КОНСТ в = ч1.дети["Маша"]   // обращение к элементу контейнерной константы; в = 10
  
  КОНСТ г = ч1.дети["Наташа"] // ошибка компиляции: нет такого элемента
  
  ПЕРЕМ н = "Наташа"
  ПЕРЕМ д = ч1.дети[н]        // ошибка выполнения: нет такого элемента
КОНЕЦ

См. также: