Axiom Справочник языка

Глава 2 · Переменные и значения

Оператор CONST

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

Форма объявления

CONST <имя> AS <тип> = <выражение>

После CONST указываются имя константы, её тип после AS и начальное выражение после знака равенства. Тип и выражение обязательны, а результат выражения должен быть совместим с указанным типом. Одна инструкция объявляет одну константу, поэтому несколько констант записываются отдельными строками.

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

CONST LIMIT AS INTEGER = 10
DIM count AS INTEGER = 7
PRINT count <= LIMIT

Результат:

TRUE

Вычисление начального значения

Когда выполнение достигает CONST, вычисляется начальное выражение, в котором допустимы обращения к переменным и вызовы функций. Полученное значение сохраняется за константой, даже если использованные при вычислении данные затем изменятся:

DIM source AS INTEGER = 5
CONST SNAPSHOT AS INTEGER = source + 1
source = 99
PRINT SNAPSHOT

Результат:

6

Повторное выполнение CONST заново вычисляет начальное выражение, поэтому в теле цикла константа получает значение при каждом проходе.

Некоторым объявлениям значение нужно ещё при компиляции — так обстоит дело с границами фиксированного массивного поля TYPE. В этих местах допустимы целочисленные константные выражения, которые компилятор вычисляет заранее; пригодность константы для такого объявления определяется её начальным выражением.

Защита от изменения

Прямое присваивание константе запрещено, как и передача её параметру BYREF, который допускает изменение переданного значения; в обоих случаях выдаётся MB2010. Ограничения распространяются и на предопределённые константы.

Данные, которые должна изменять подпрограмма, объявляются обычной переменной через DIM. Правила передачи аргументов приведены в статье «Вызовы и аргументы». Форма STRING * N в CONST не поддерживается.

Массивное значение константы

CONST <имя>[] AS <тип элемента> = <массивное выражение>
CONST <имя>[,] AS <тип элемента> = <двумерное массивное выражение>

Для массива квадратные скобки находятся после имени: пустая пара задаёт ранг 1, запятые — большее число измерений. Тип элемента и начальное выражение обязательны, ранг и тип элементов должны совпадать. Границы в таком объявлении не задаются: они приходят из начального массива. Обращение к константе целиком также требует []; индекс выбирает элемент. Суффикс массива после типа в именованном объявлении CONST запрещён с MB2003.

CONST fruits[] AS STRING = SPLIT("яблоко,банан", ",")
PRINT fruits[2]
PRINT ARRAYLENGTH(fruits[])

Результат:

банан
2

CONST защищает имя от записи и передачи BYREF. Обычное присваивание массива из константы создаёт независимую копию по общим правилам; изменение копии не меняет константу. Явная функция ARRAYCLONE также копирует данные.

Предопределённые имена

Три имени уже доступны без объявления:

ИмяЗначение и назначениеТип
PIЧисло πDOUBLE
ROW1, первое измерение массиваINTEGER
COLUMN2, второе измерение массиваINTEGER

В аргументах, задающих номер измерения массива, вместо чисел 1 и 2 можно указывать ROW и COLUMN. Переобъявить PI, ROW или COLUMN через DIM либо CONST, а также дать эти имена процедурам SUB и функциям FUNCTION верхнего уровня нельзя.

Константа модуля

PUBLIC CONST <имя> AS <тип> = <выражение>
PRIVATE CONST <имя> AS <тип> = <выражение>

PUBLIC и PRIVATE допустимы только перед объявлением верхнего уровня файла. С PUBLIC константа доступна файлам, которые явно импортируют этот модуль; с PRIVATE или без модификатора доступ ограничен текущим файлом. Импортируемая константа также защищена от присваивания и передачи BYREF. Правила доступности и импорта приведены в статьях PUBLIC и PRIVATE и IMPORT.

Диагностика

  • MB2010: присваивание константе или передача константы параметру BYREF.
  • MB2002: повторное объявление имени, включая PI, ROW или COLUMN.
  • MB2016: объявление перекрывает доступную внешнюю переменную или константу.
  • MB2003: начальное значение несовместимо с типом константы.
  • MB2018: числовая константа не помещается в указанный тип.
  • MB2026: в CONST использована форма STRING * N.

Запускаемые примеры

См. также

Различие объявления и присваивания объясняют Переменные и значения. Изменяемую переменную создаёт DIM, а новое значение в неё записывает присваивание. Применение ROW и COLUMN описано в функциях массивов, константные границы полей — в TYPE.