Массивы в стандартном Common Lisp могут быть многомерными.
Словарь Array описывает доступные операции.
CL-USER 12 > (defparameter *a* (make-array '(3 2 4) :initial-element 'foo))
*A*
CL-USER 13 > *a*
#3A(((FOO FOO FOO FOO) (FOO FOO FOO FOO))
((FOO FOO FOO FOO) (FOO FOO FOO FOO))
((FOO FOO FOO FOO) (FOO FOO FOO FOO)))
CL-USER 14 > (setf (aref *a* 1 1 2) 'bar)
BAR
CL-USER 15 > *a*
#3A(((FOO FOO FOO FOO) (FOO FOO FOO FOO))
((FOO FOO FOO FOO) (FOO FOO BAR FOO))
((FOO FOO FOO FOO) (FOO FOO FOO FOO)))
CL-USER 16 > (array-dimensions *a*)
(3 2 4)
Когдапри работе с массивами может быть полезно использовать другую функцию Common Lisp: объявления типов и оптимизацию компилятора.Common Lisp позволяет писать общий код без объявления типов.Но в критических разделах можно объявлять типы для переменных, параметров, возвращаемых значений и так далее.Затем можно дать указание компилятору избавиться от некоторых проверок или использовать специфические для типа операции.Объем поддержки зависит от компилятора.Существуют более сложные компиляторы, такие как SBCL, LispWorks и Allegro CL, которые поддерживают широкий спектр оптимизаций.Некоторые компиляторы также предоставляют большое количество информации о компиляции.
В крайнем случае следует использовать интерфейс внешних функций (FFI) для вызова кода C или использования встроенного ассемблера (который поддерживается некоторыми компиляторами).
Common Lisp по умолчанию имеет макрос LOOP в стандарте.Это позволяет выразить типичные императивные циклические конструкции.Существует также альтернатива, макрос ITERATE - он может иметь некоторые преимущества для многомерных массивов.
Также обратите внимание, что массивы Lisp имеют некоторые необычные функции, такие как смещенные массивы.Они используют хранилище некоторого другого массива, но могут иметь разную размерную компоновку.
Иногда также полезно писать специальные макросы, которые скрывают шаблон использования массивов.Без этого кода на Лиспе с объявлениями типов многомерные массивы и LOOP могут быть немного большими.Пример типичного кода, в котором не используются специальные лингвистические абстракции:Общие компиляторы Lisp.Могут существовать исключения.