Функции, оперирующие с элементами списков
Функция map(f,expr1,...,exprn) позволяет применить функцию (оператор, символ операции) f к частям выражений expr1, expr2, ...,exprn. При использовании со списками применяет f к каждому элементу списка. Следует обратить внимание, что f - именно имя функции (без указания переменных, от которых она зависит). Примеры:
Функция f может быть и заданной пользователем, например:
Функция apply применяет заданную функцию ко всему списку (список становится списком аргументов функции; при вызове (F,[x1,...,xn] вычисляется выражение F(arg1,...,argn)). Следует учитывать, что apply не распознаёт ординарные функции и функции от массива. Пример:
Чтобы найти максимальный или минимальный элемент набора чисел, надо вызвать функции "max"или "min". Однако, обе функции в качестве аргумента ожидают несколько чисел, а не список, составленный из чисел. Применять подобные функции к спискам и позволяет функция "apply":
Массивы
Массивы в Maxima - совокупности однотипных объектов с индексами. Число индексов не должно превышать пяти. В Maxima существуют и функции с индексами (функции массива). Возможно создание и использование переменных с индексами до объявления соответствующего массива. Такие переменные рассматриваются как элементы массивов с неопределёнными размерностями (так называемые хэш-массивы). Размеры неопределённых массивов растут динамически по мере присваивания значений элементам. Интересно, что индексы массивов с неопределёнными границами не обязательно должны быть числами. Для повышения эффективности вычислений рекомендуется преобразовывать массивы с неопределёнными границами в обычные массивы (для этого используется функция array). Создание массива производится функцией array. Синтаксис обращения к функции:
array (name, dim_1, ..., dim_n)
array (name, type, dim_1, ..., dim_n)
array ([name_1, ..., name_m], dim_1, ..., dim_n)
Индексы обычного массива - целые числа, изменяющиеся от 0 до dimi. Пример:
Функция listarray, использованная в примере, преобразовывает массив в список. Синтаксис вы зова: listarray (A) Аргумент А может быть определённым или неопределённым массивом, функцией массива или функцией с индексами. Порядок включения элементов массива в список - по строкам. Функция arrayinfo выводит информацию о массиве А. Синтаксис вызова: arrayinfo(A) Аргумент А, как и в случае listarray, может быть определённым или неопредедённым массивом, функцией массива или функцией с индексами. Пример использования:
Функции listarray и arrayinfo применимы и к функциям массива:
Ещё один пример - создание и вывод информации о функциях с индексами:
Функция makearray(type,dim1,...,dimn) создаёт и возвращает массив Lisp. Тип массива может быть any, flonum, fixnum, hashed, functional. Индекс i можкт изменяться в пределах от 0 dimi− 1. Достоинство make_array по сравнению с array - возможность динамически управлять распреде- лением памяти для массивов. Присваивание y : make_array(...) создаёт ссылку на массив. Когда массив больше не нужен, ссылка уничтожается присваиванием y : false, память освобождается затем сборщиком мусора. Примеры:
Переменная arrays содержит список имен массивов первого и второго видов, определенных на данный момент. Пример:
Функция fillarray позволяет заполнять массивы значениями из другого массива или списка. Заполнения производится по строкам. Примеры:
Как видно из рассмотренных примеров, длина списка может и не совпадать с размерностью массива. Если указан тип массива, он должен заполняться элементами того же типа. Удаление массивов из памяти осуществляется функцией remarray. Кроме того, для изменения размерности массива имеется функция rarray(A,dim1,...,dimn). Новый массив заполняется элементами старого по строкам. Если размер старого масива меньше, чем нового, остатокнового заполняется нулями или false (в зависимости от типа массива).