Заметим, что переменная не получает памяти, если хотя бы одна граница по измерениям равна нулю. Такая переменная впоследствии может получить память с помощью операции realloc, add_value либо set_value. Переменная, имеющая память, может быть перераспределена с помощью этих же операций на нулевой размер и стать переменной без памяти.
Инфиксная операция index_of (индекс) возвращает обобщенный индекс компоненты массива, заданного в левой части, содержащей значение, указанное в правой части. Синтаксис:
A index_of i
или
A индекс i
Здесь A – массив, i – значение или последовательность значений.
В результате выполнения операции возвращается последовательность, содержащая целые значения обобщенных индексов компонент массива. Если значение i содержится в нескольких компонентах массива А, то возвращается последовательность индексов всех этих компонент в порядке возрастания. Если значение i не содержится в массиве, результат – последовательность нулевой длины.
Префиксные операции indmin и indmax возвращают обобщенный индекс минимального и максимального элемента массива. Эти операции применимы только к арифметическим переменным и не могут использоваться для булевых и строковых. Если минимальное (максимальное) значение повторяется в массиве несколько раз, будет найден наименьший индекс.
Префиксные операции min и max возвращают соответственно минимальное и максимальное значение компонент арифметического массива.
В предыдущих разделах было уже упомянуто, что выражения в языке «Ядро» - это запись действий, которые производятся над последовательностями для получения новой последовательности. С точки зрения синтаксиса выражением является последовательность, состоящая из основ, скобок, префиксов и инфиксов. Некоторые знаки (плюс и минус) могут быть как префиксами, так и инфиксами; будем называть их префикс/инфиксами.
Основой может быть: а) константа; б) переменная; в) основа в круглых скобках; г) основа в квадратных скобках (индексное выражение); д) префикс и основа; е) основа, инфикс и основа; ж) переменная с индексным выражением в квадратных скобках.
Отличием языка является наличие «пустых» основ и инфиксов, которые подразумеваются по умолчанию в нужных точках программы, чтобы обеспечить синтаксическую правильность. Вставка пустых основ и инфиксов производится по следующим правилам.
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;
Подобные «ловушки» неизбежны и требуют навыка в использовании языка, внимания при написании и вводе программы.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.