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

10 · Массивы

Переход массивов на квадратные скобки

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

Было и стало

Прежняя записьДействующая записьСмысл
DIM fruits() AS STRINGDIM fruits[] AS STRINGДинамический массив ранга 1.
DIM grid(,) AS INTEGERDIM grid[,] AS INTEGERДинамический массив ранга 2.
DIM values(1 TO 3) AS INTEGERDIM 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 valuesERASE 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, встроенных функций и математических выражений не заменяются.

Новые литералы массивов, новые коллекции и новые имена встроенных функций этим переходом не вводятся.

См. также

Массивы · Индексирование · DIM · REDIM · ERASE · Вызовы · TYPE