LISP позволяет вам определять одно- или многомерные массивы с помощью функции make-array . Массив может хранить любой объект LISP в качестве своих элементов.
Все массивы состоят из смежных областей памяти. Самый низкий адрес соответствует первому элементу, а самый высокий адрес — последнему.
Количество измерений массива называется его рангом.
В LISP элемент массива задается последовательностью неотрицательных целочисленных индексов. Длина последовательности должна равняться рангу массива. Индексирование начинается с нуля.
Например, чтобы создать массив из 10 ячеек с именем my-array, мы можем написать:
(setf my-array (make-array '(10)))
Функция aref позволяет получить доступ к содержимому ячеек. Он принимает два аргумента: имя массива и значение индекса.
Например, чтобы получить доступ к содержимому десятой ячейки, мы пишем —
(aref my-array 9)
Пример 1
Создайте новый файл исходного кода с именем main.lisp и введите в него следующий код.
(write (setf my-array (make-array '(10)))) (terpri) (setf (aref my-array 0) 25) (setf (aref my-array 1) 23) (setf (aref my-array 2) 45) (setf (aref my-array 3) 10) (setf (aref my-array 4) 20) (setf (aref my-array 5) 17) (setf (aref my-array 6) 25) (setf (aref my-array 7) 19) (setf (aref my-array 8) 67) (setf (aref my-array 9) 30) (write my-array)
Когда вы выполняете код, он возвращает следующий результат —
#(NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL) #(25 23 45 10 20 17 25 19 67 30)
Пример 2
Давайте создадим массив 3 на 3.
Создайте новый файл исходного кода с именем main.lisp и введите в него следующий код.
(setf x (make-array '(3 3) :initial-contents '((0 1 2 ) (3 4 5) (6 7 8))) ) (write x)
Когда вы выполняете код, он возвращает следующий результат —
#2A((0 1 2) (3 4 5) (6 7 8))
Пример 3
Создайте новый файл исходного кода с именем main.lisp и введите в него следующий код.
(setq a (make-array '(4 3))) (dotimes (i 4) (dotimes (j 3) (setf (aref a i j) (list i 'x j '= (* i j))) ) ) (dotimes (i 4) (dotimes (j 3) (print (aref a i j)) ) )
Когда вы выполняете код, он возвращает следующий результат —
(0 X 0 = 0) (0 X 1 = 0) (0 X 2 = 0) (1 X 0 = 0) (1 X 1 = 1) (1 X 2 = 2) (2 X 0 = 0) (2 X 1 = 2) (2 X 2 = 4) (3 X 0 = 0) (3 X 1 = 3) (3 X 2 = 6)
Полный синтаксис для функции make-array
Функция make-array принимает много других аргументов. Давайте посмотрим на полный синтаксис этой функции —
make-array dimensions :element-type :initial-element :initial-contents :adjustable :fill-pointer :displaced-to :displaced-index-offset
Помимо аргумента измерений , все остальные аргументы являются ключевыми словами. В следующей таблице приведено краткое описание аргументов.
Sr.No. | Аргумент и описание |
---|---|
1 |
размеры Это дает размеры массива. Это число для одномерного массива и список для многомерного массива. |
2 |
: элемент типа Это спецификатор типа, значением по умолчанию является T, т.е. любой тип |
3 |
: начально-элемент Значение начальных элементов. Это создаст массив со всеми элементами, инициализированными к определенному значению. |
4 |
: начально-контент Исходный контент как объект. |
5 |
: регулируемая Это помогает в создании изменяемого размера (или настраиваемого) вектора, базовая память которого может быть изменена. Аргумент является логическим значением, указывающим, является ли массив регулируемым или нет, значение по умолчанию равно NIL. |
6 |
: заполняющая указатель Он отслеживает количество элементов, фактически сохраненных в векторе с изменяемыми размерами. |
7 |
: смещаются к Это помогает в создании смещенного массива или общего массива, который делится своим содержимым с указанным массивом. Оба массива должны иметь одинаковый тип элемента. Опция: displaced-to не может использоваться с опцией: initial-element или: initial-contents. Этот аргумент по умолчанию равен нулю. |
8 |
: перемещенный-индекс-смещение Это дает смещение индекса созданного общего массива. |
размеры
Это дает размеры массива. Это число для одномерного массива и список для многомерного массива.
: элемент типа
Это спецификатор типа, значением по умолчанию является T, т.е. любой тип
: начально-элемент
Значение начальных элементов. Это создаст массив со всеми элементами, инициализированными к определенному значению.
: начально-контент
Исходный контент как объект.
: регулируемая
Это помогает в создании изменяемого размера (или настраиваемого) вектора, базовая память которого может быть изменена. Аргумент является логическим значением, указывающим, является ли массив регулируемым или нет, значение по умолчанию равно NIL.
: заполняющая указатель
Он отслеживает количество элементов, фактически сохраненных в векторе с изменяемыми размерами.
: смещаются к
Это помогает в создании смещенного массива или общего массива, который делится своим содержимым с указанным массивом. Оба массива должны иметь одинаковый тип элемента. Опция: displaced-to не может использоваться с опцией: initial-element или: initial-contents. Этот аргумент по умолчанию равен нулю.
: перемещенный-индекс-смещение
Это дает смещение индекса созданного общего массива.
Пример 4
Создайте новый файл исходного кода с именем main.lisp и введите в него следующий код.
(setq myarray (make-array '(3 2 3) :initial-contents '(((a b c) (1 2 3)) ((d e f) (4 5 6)) ((g h i) (7 8 9)) )) ) (setq array2 (make-array 4 :displaced-to myarray :displaced-index-offset 2)) (write myarray) (terpri) (write array2)
Когда вы выполняете код, он возвращает следующий результат —
#3A(((A B C) (1 2 3)) ((D E F) (4 5 6)) ((G H I) (7 8 9))) #(C 1 2 3)
Если смещенный массив является двумерным —
(setq myarray (make-array '(3 2 3) :initial-contents '(((a b c) (1 2 3)) ((d e f) (4 5 6)) ((g h i) (7 8 9)) )) ) (setq array2 (make-array '(3 2) :displaced-to myarray :displaced-index-offset 2)) (write myarray) (terpri) (write array2)
Когда вы выполняете код, он возвращает следующий результат —
#3A(((A B C) (1 2 3)) ((D E F) (4 5 6)) ((G H I) (7 8 9))) #2A((C 1) (2 3) (D E))
Давайте изменим смещение смещенного индекса на 5 —
(setq myarray (make-array '(3 2 3) :initial-contents '(((a b c) (1 2 3)) ((d e f) (4 5 6)) ((g h i) (7 8 9)) )) ) (setq array2 (make-array '(3 2) :displaced-to myarray :displaced-index-offset 5)) (write myarray) (terpri) (write array2)
Когда вы выполняете код, он возвращает следующий результат —
#3A(((A B C) (1 2 3)) ((D E F) (4 5 6)) ((G H I) (7 8 9))) #2A((3 D) (E F) (4 5))
Пример 5
Создайте новый файл исходного кода с именем main.lisp и введите в него следующий код.
;a one dimensional array with 5 elements, ;initail value 5 (write (make-array 5 :initial-element 5)) (terpri) ;two dimensional array, with initial element a (write (make-array '(2 3) :initial-element 'a)) (terpri) ;an array of capacity 14, but fill pointer 5, is 5 (write(length (make-array 14 :fill-pointer 5))) (terpri) ;however its length is 14 (write (array-dimensions (make-array 14 :fill-pointer 5))) (terpri) ; a bit array with all initial elements set to 1 (write(make-array 10 :element-type 'bit :initial-element 1)) (terpri) ; a character array with all initial elements set to a ; is a string actually (write(make-array 10 :element-type 'character :initial-element #\a)) (terpri) ; a two dimensional array with initial values a (setq myarray (make-array '(2 2) :initial-element 'a :adjustable t)) (write myarray) (terpri) ;readjusting the array (adjust-array myarray '(1 3) :initial-element 'b) (write myarray)
Когда вы выполняете код, он возвращает следующий результат —