По мотивам обсуждения
строк в O7. Чего не хватает в языке, чтобы использовать ARRAY OF CHAR как строку (дабы не плодить дополнительных сущностей в виде типа STRING или еще чего). Все уперлось прежде всего в то, что нельзя создать массив заранее неизвестного размера. Вобщем изначально было понятно, что с динамическими массивами придется что-то придумывать, поэтому текущая идея вызревала давно. А конкретная проблема со строками позволяет проверить идею на практике.
Итак, предложение по расширению O7 динамическими массивами.
1. Массив может быть объявлен без указания размера, в этом случае считается, что он
динамический:
TYPE
A = ARRAY OF CHAR;
R = RECORD a: ARRAY OF INTEGER END;
VAR
a: ARRAY OF BOOLEAN;
2. Размер динамического массива по умолчанию - 0. Размер можно увеличить или уменьшить с помощью предопределенной функции
RESIZE. Оставшиеся элементы после RESIZE сохраняют свое значение. Новые элементы имеют значение
по умолчанию.
3. Присваивание массивов.
- Динамический массив присваивается другому динамическому массиву (конечно при сохранении типов элементов). После присваивания оба массива имеют одинаковый размер и содержимое.
- Обычный массив или открытый массив присваивается в динамический.
- Нельзя присвоить динамический массив в обычный или открытый (ошибка компиляции).
4. Открытые массивы (в формальных параметрах).
Синтаксис открытых массивов меняется - добавляется ключевое слово
ANY, иначе они выглядят как динамические, хотя семантика различается (см. 3).
PROCEDURE p(VAR a1: ARRAY OF INTEGER; a2: ANY ARRAY OF CHAR; VAR a3: ANY ARRAY OF BOOLEAN);
a1 - динамический массив (содержимое и размер может меняться).
a2 - открытый массив (неизменяемый).
a3 - открытый массив (содержимое может меняться, но не размер).
Динамический массив в формальных параметрах может быть использован только с VAR. Без VAR он не имеет смысла, так как его размер не может быть изменен.
При подстановке фактических параметров:
- только динамический массив может быть использован если формальный параметр - динамический массив
- любой массив может быть использован если формальный параметр - открытый массив
5. Многомерные массивы.
Если динамический массив объявлен в качестве элемента другого массива, то он по-прежнему может иметь произвольный размер независимо от размера других элементов.
VAR a: ARRAY 2 OF ARRAY OF INTEGER;
...
RESIZE(a[0], 3);
RESIZE(a[1], 5);
ASSERT(LEN(a[0] = 3);
ASSERT(LEN(a[1] = 5);
Уфф. Вроде все. Критикуйте