Учебники

ЛИСП — Массивы

LISP позволяет вам определять одно- или многомерные массивы с помощью функции make-array . Массив может хранить любой объект LISP в качестве своих элементов.

Все массивы состоят из смежных областей памяти. Самый низкий адрес соответствует первому элементу, а самый высокий адрес — последнему.

Ранг

Количество измерений массива называется его рангом.

В LISP элемент массива задается последовательностью неотрицательных целочисленных индексов. Длина последовательности должна равняться рангу массива. Индексирование начинается с нуля.

Например, чтобы создать массив из 10 ячеек с именем my-array, мы можем написать:

(setf my-array (make-array '(10)))

Функция aref позволяет получить доступ к содержимому ячеек. Он принимает два аргумента: имя массива и значение индекса.

Например, чтобы получить доступ к содержимому десятой ячейки, мы пишем —

(aref my-array 9)

Пример 1

Создайте новый файл исходного кода с именем main.lisp и введите в него следующий код.

Live Demo

(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 и введите в него следующий код.

Live Demo

(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 и введите в него следующий код.

Live Demo

(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 и введите в него следующий код.

Live Demo

(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)

Если смещенный массив является двумерным —

Live Demo

(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 —

Live Demo

(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 и введите в него следующий код.

Live Demo

;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)

Когда вы выполняете код, он возвращает следующий результат —