10 · Массивы
Переход массивов на квадратные скобки
В действующем договоре Axiom квадратные скобки различают массивное имя, индекс и срез, а круглые скобки сохраняют назначение вызова функции и группировки выражения. Эта страница сопоставляет прежнюю запись с новой и перечисляет формы, которые нужно исправлять в исходных программах.
Было и стало
| Прежняя запись | Действующая запись | Смысл |
|---|---|---|
DIM fruits() AS STRING | DIM fruits[] AS STRING | Динамический массив ранга 1. |
DIM grid(,) AS INTEGER | DIM grid[,] AS INTEGER | Динамический массив ранга 2. |
DIM values(1 TO 3) AS INTEGER | DIM values[1 TO 3] AS INTEGER | Массив с заданными границами. |
values(2) | values[2] | Элемент массива. |
values() | values[] | Массив целиком. |
values(1 TO 2) | values[1 TO 2] | Срез или представление выбранной области. |
DIM values AS STRING () = ... | DIM values[] AS STRING = ... | Инициализация с явным типом; суффикс находится только после имени. |
DIM values = ... | DIM values[] = ... | Инициализация с выводом типа по массивному результату. |
STRING(), INTEGER(,) | STRING[], INTEGER[,] | Массивный тип без имени, например в результате функции или безымянном параметре функционального типа. |
SUB Show(values AS STRING()) | SUB Show(values[] AS STRING) | Именованный параметр массива; список параметров остаётся круглым. |
FUNCTION MakeFruits() AS STRING() | FUNCTION MakeFruits() AS STRING[] | Тип массивного результата без имени. |
REDIM PRESERVE values(1 TO 5) | REDIM PRESERVE values[1 TO 5] | Изменение границ с сохранением пересечения. |
ERASE values | ERASE values[] | Освобождение целого массива. |
bag.items или bag.items() | bag.items[] | Массивное поле целиком. |
Целый массив и элемент
Квадратный суффикс [] обязателен у объявленного массивного имени или поля, когда выражение обозначает массив целиком. Сам суффикс обозначает весь массив и не означает пустое хранилище. Присваивание создаёт независимую копию:
DIM fruits[] AS STRING = SPLIT("яблоко,банан", ",")
DIM basket[] = fruits[]
basket[2] = "груша"
PRINT fruits[2]
DIM copy[] = ARRAYCLONE(fruits[])
copy[1] = "слива"
PRINT fruits[1]Вывод:
банан
яблокоПервая запись изменяет только basket: обычное присваивание уже создаёт независимую копию. ARRAYCLONE(fruits[]) остаётся явной функцией копирования. Для массива любого ранга целая форма остаётся name[]; ранг определяется его типом.
Вызов функции не становится индексированием
Круглые скобки сохраняются у функций и процедур. Функция, возвращающая массив, вызывается обычной записью MakeFruits(). Элемент результата выбирается после вызова: MakeFruits()[2]. Дополнительный суффикс [] после вызова для обозначения результата не нужен.
FUNCTION MakeFruits() AS STRING[]
DIM result[] AS STRING = SPLIT("яблоко,банан", ",")
RETURN result[]
END FUNCTION
DIM basket[] = MakeFruits()
PRINT MakeFruits()[2]Вызов функции и квадратное индексирование могут находиться в одном выражении. Вложенный вызов внутри индекса также остаётся вызовом: fruits[ChooseFruit()].
Параметры и возвращаемые типы
Именованный параметр массива получает квадратный суффикс после имени: SUB ShowBasket(values[] AS STRING) или BYREF values[] AS STRING. В функциональном типе и возвращаемом типе имя отсутствует, поэтому ранг входит в запись типа: STRING[], INTEGER[,]. Круглые скобки списка параметров и вызова не меняются.
SUB ShowBasket(values[] AS STRING)
PRINT values[2]
END SUB
FUNCTION MakeGrid() AS INTEGER[,]
DIM grid[,] AS INTEGER
RETURN grid[]
END FUNCTIONПередача массива в функцию сохраняет круглые скобки вызова: ARRAYSLICE(fruits[], 1, 2). Внутри них fruits[] обозначает весь массив, а не отдельный элемент.
REDIM, ERASE и поля TYPE
Границы REDIM записываются в квадратных скобках после имени. Целый динамический массив передаётся как values[], а элемент — как values[2]. Для массивного поля действуют те же правила: bag.items[], bag.items[1], ERASE bag.items[]. Суффикс типа после AS не используется в DIM: запись DIM values AS STRING[] не заменяет DIM values[] AS STRING.
TYPE Basket
Items[] AS STRING
END TYPE
DIM bag AS Basket
REDIM bag.Items[1 TO 2]
bag.Items[1] = "яблоко"
ERASE bag.Items[]Квадратная запись определяет синтаксис доступа. Действующий договор копирования требует независимых значений при присваивании и BYVAL; явный BYREF сохраняет связь с исходной переменной.
Формы, которые нужно исправить
values(2)заменяется наvalues[2]; круглая запись массива не является действующей формой.valuesв месте, где требуется массив целиком, заменяется наvalues[]; имя без суффикса не угадывает массивный тип.DIM values AS STRING () = ...заменяется наDIM values[] AS STRING = ...; суффикс после типа запрещён.DIM values = SPLIT(...)заменяется наDIM values[] = SPLIT(...); выведенное объявление массива без суффикса запрещено.- Круглые скобки у
FUNCTION,SUB, встроенных функций и математических выражений не заменяются.
Новые литералы массивов, новые коллекции и новые имена встроенных функций этим переходом не вводятся.