Программирование на языке «Ядро»: Руководство пользователя, страница 6

Заметим, что переменная не получает памяти, если хотя бы одна граница по измерениям равна нулю. Такая переменная впоследствии может получить память с помощью операции realloc, add_value либо set_value. Переменная, имеющая память, может быть перераспределена с помощью этих же операций на нулевой размер и стать переменной без памяти.

1.3.5. Операции поиска значений в массиве

Инфиксная операция index_of (индекс) возвращает обобщенный индекс компоненты массива, заданного в левой части, содержащей значение, указанное в правой части. Синтаксис:

A index_of i 

или 

A индекс i

Здесь A – массив, i – значение или последовательность значений.

В результате выполнения операции возвращается последовательность, содержащая целые значения обобщенных индексов компонент массива. Если значение i содержится в нескольких компонентах массива А, то возвращается последовательность индексов всех этих компонент в порядке возрастания. Если значение i не содержится в массиве, результат – последовательность нулевой длины.

Префиксные операции indmin и indmax возвращают обобщенный индекс минимального и максимального элемента массива. Эти операции применимы только к арифметическим переменным и не могут использоваться для булевых и строковых. Если минимальное (максимальное) значение повторяется в массиве несколько раз, будет найден наименьший индекс.

Префиксные операции min и max возвращают соответственно минимальное и максимальное значение компонент арифметического массива.

1.4. Выражения

1.4.1. Синтаксис выражений

В предыдущих разделах было уже упомянуто, что выражения в языке «Ядро» - это запись действий, которые производятся над последовательностями для получения новой последовательности. С точки зрения синтаксиса выражением является последовательность, состоящая из основ, скобок, префиксов и инфиксов. Некоторые знаки (плюс и минус) могут быть как префиксами, так и инфиксами; будем называть их префикс/инфиксами.

Основой может быть: а) константа; б) переменная; в) основа в круглых скобках; г) основа в квадратных скобках (индексное выражение); д) префикс и основа; е) основа, инфикс и основа; ж) переменная с индексным выражением в квадратных скобках.

Отличием языка является наличие «пустых» основ и инфиксов, которые подразумеваются по умолчанию в нужных точках программы, чтобы обеспечить синтаксическую правильность. Вставка пустых основ и инфиксов производится по следующим правилам.

1. После инфикса: ожидается основа (не может быть инфикс, не может быть правая скобка). Префикс/инфикс считается префиксом. Перед инфиксом и правой скобкой вставляется пустая основа.

2. После префикса: ожидается основа (не может быть инфикс, не может быть закрывающая скобка). Перед инфиксом и правой скобкой вставляется пустая основа.

3. После константы, переменной, правой скобки: ожидается инфикс. Перед префиксом, константой, переменной и левой скобкой вставляется пустой инфикс, а перед левой квадратной скобкой вставляется инфикс индексации. Пустой инфикс интерпретируется как запятая.

4. После левой скобки ожидается основа (не может быть инфикс и правая скобка). Перед инфиксом и правой скобкой вставляется пустая основа.

Символ «запятая» является инфиксной операцией, которая соединяет две последовательности – слева и справа от запятой. Вместо запятой обычно (кроме исключений, которые рассматриваются ниже) можно использовать пробел – пустой инфикс. Знак присваивания – это тоже инфиксная операция, которая помещает последовательность значений из правой части в переменные (элементы массивов), определенные последовательностью адресов из левой части. Число скалярных адресов или значений – мощность (длину) последовательности – можно выяснить с помощью префиксной операции size, которая по последовательности-аргументу вычисляет последовательность из одного целочисленного элемента, значение которого равно мощности последовательности-аргумента; например, size(1,2,3,4)=4.

Значение пустой основы определяется контекстом. В примерах на рисунке 7 и далее в тексте предыдущего раздела уже встречалась пустая основа в качестве индексной позиции для изображения пустого индекса (последовательности всех возможных значений индекса). В правой части оператора присваивания пустая основа означает пустое значение, которое не изменяет значений переменной в левой части. Например, оператор:

Х[1:4]:=1,2,,3;

присваивает значения 1, 2 и 3 первому, второму и четвертому элементу массива Х, а значение третьего элемента остается неизменным. В левой части оператора пустая основа означает пустой адрес, который игнорируется при выполнении присваивания. Например, оператор:

            X[1],,X[3]:=1,2,3;

вызывает присваивание значения 1 первому элементу массива Х и значения 3 – третьему элементу; значение 2 соответствует пустой основе в левой части и ничему не присваивается.

Правила вставки пустых основ и инфиксов позволяют практически любую последовательность слов языка «Ядро» сделать синтаксически правильной. Однако оборотной стороной этого достоинства языка является то, что интерпретатор может «подправить» программу, и она будет выполнять не то, чего хотел (но неверно выразил) программист. Например, оператор:

Х:=1 2 3 4;

совершенно ясно выражает, чего хотел программист: присвоить четыре значения переменной Х. Синтаксически этот оператор становится правильным после вставки между числовыми константами пустых инфиксов, равносильных запятым. Однако следующий оператор:

Х:= -1 -2 -3 -4;

лишь на первый взгляд мало отличается от предыдущего. Знак «минус» может быть как префиксом, так и инфиксом. Первый минус, несомненно, префикс, поскольку он следует за инфиксом – знаком присваивания. Однако все остальные минусы следуют за основами, и поэтому интерпретатор считает их инфиксами. В результате всем компонентам массива Х будет присвоено значение арифметического выражения (равное -10); никаких сообщений об ошибке при этом не будет, т.к. присваивание скалярного значения переменной произвольной длины вполне допустимо. Поэтому правильно записать это присваивание в виде:

Х:= -1, -2, -3, -4;

Подобные «ловушки» неизбежны и требуют навыка в использовании языка, внимания при написании и вводе программы.

1.4.2. Арифметические операции и математические функции