Многомерные массивы в QPILE
В QPILE нет понятия "массив". Тем более нет многомерных массивов. Однако в некоторых случаях необходимы операции с объектами матричной структуры. Решение проблемы на первый взгляд неочевидно.
Самый простой и наглядный способ - в использовании ассоциативных массивов. Вот решение для трехмерного массива:
FUNC create_array()
result = create_map()
END FUNC

FUNC set_array(array,x,y,z,value)
result = set_value(array,"~"&x&"~"&y&"~"&z ,value)
END FUNC
FUNC get_array(array,x,y,z)
result = get_value(array,"~"&x&"~"&y&"~"&z)
END FUNC
Функция create_array() просто создает ассоциативный массив. Функция эта создана исключительно как дань практике пристойного программирования
. Заполнение массива идет функцией set_array(). Она добавляет в ассоциативный массив array значение value с уникальным ключом, составленным из трех индексов x,y и z. Соответственно get_array() возвращает значение элемента ассоциативного массива с ключом, вычисленным из индексов по тем же правилам.
Для M4 просто загляденье получается:
define(create_array,"")) define(set_array,set_value($1,"~"&$2&"~"&$3&"~"&z ,$4)) define(get_array,get_value($1,"~"&$2&"~"&$3&"~"&$4))
Особенности:
- массивы динамические - нет ограничений на размерность
- заполнение элементов массива может идти в произвольном порядке
- значениями массива могут быть любые типы, определённые в QPILE - числа, строки, коллекции, другие ассоциативные массивы
- незаполненные элементы всегда проинициализированы пустой строкой
- относительно низкая производительность - не стоит использовать очень большие объёмы данных
- произвольная размерность массивов
См. также Динамические многомерные массивы в Lua.
