Именованные константы
Чтобы локализовать в исходном тексте то или иное часто используемое значение с одним смыслом, применяются именованные константы. Использование именованных констант позволяет проще изменять исходные тексты, избегая поиска значений по всему тексту. Использование констант не приводит к дополнительным расходам времени на этапе выполнения программы, что делает их применение более привлекательным по сравнению с хранением постоянных значений в переменных. Значение именованной константы подставляется в код точно так же, как если бы значение было указано явно.
В соответствии с видимостью имен, именованные константы делятся на глобальные и локальные. Глобальные константы объявляются вне объявления типа и тела функции или метода. Локальные константы объявляются в теле функции или метода и доступны только от места объявления до конца функции.
Объявление осуществляется с помощью ключевого слова КОНСТ. После него указывается имя константы, знак равенства и константное выражение, определяющее значение константы. Перед именем константы может явно указываться имя типа - для тех случаев, когда тип не определяется из выражения или определяется неоднозначно.
Если тип константы указан явно, то он должен в точности соответствовать типу значения константы, т.к. никаких преобразований на этапе компиляции не выполняется. Исключение из этого правила составляют типы ЦЕЛОЕ и ЧИСЛО, для которых выполняется автоматическое преобразование, если значение находится в допустимом диапазоне (при преобразовании из вещественного числа в целое).
Синтаксис:
Глобальные константы:
КОНСТ <имя> = <константное выражение>;
или
КОНСТ <имя типа>: <имя> = <константное выражение>;
или для констант контейнерного типа:
КОНСТ <тип элемента>: <имя>[<список типов индеков>] = <константное выражение>;Локальные константы:
КОНСТ <имя> = <константное выражение>
или
КОНСТ <имя типа>: <имя> = <константное выражение>
или для констант контейнерного типа:
КОНСТ <тип элемента>: <имя>[<список типов индеков>] = <константное выражение>
Объявление глобальной константы обязано заканчиваться точкой с запятой. Для локальных констант такого требования нет, но и наличие точки с запятой ошибкой не является.
Именованные константы могут также объявляться модулями.
Примеры
КОНСТ пи = 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.дети[н] // ошибка выполнения: нет такого элемента КОНЕЦ