Учебники

ЛИСП — Векторы

Векторы являются одномерными массивами, следовательно, подтипом массива. Векторы и списки вместе называются последовательностями. Поэтому все обобщенные функции последовательности и функции массива, которые мы обсуждали до сих пор, работают с векторами.

Создание векторов

Функция вектора позволяет создавать векторы фиксированного размера с конкретными значениями. Он принимает любое количество аргументов и возвращает вектор, содержащий эти аргументы.

Пример 1

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

Live Demo

(setf v1 (vector 1 2 3 4 5))
(setf v2 #(a b c d e))
(setf v3 (vector 'p 'q 'r 's 't))

(write v1)
(terpri)
(write v2)
(terpri)
(write v3)

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

#(1 2 3 4 5)
#(A B C D E)
#(P Q R S T)

Обратите внимание, что LISP использует синтаксис # (…) в качестве литеральной записи для векторов. Вы можете использовать этот синтаксис # (…) для создания и включения литеральных векторов в ваш код.

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

Функция make-array является более общим способом создания вектора. Вы можете получить доступ к векторным элементам, используя функцию aref .

Пример 2

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

Live Demo

(setq a (make-array 5 :initial-element 0))
(setq b (make-array 5 :initial-element 2))

(dotimes (i 5)
   (setf (aref a i) i))
   
(write a)
(terpri)
(write b)
(terpri)

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

#(0 1 2 3 4)
#(2 2 2 2 2)

Заполнить указатель

Функция make-array позволяет вам создавать изменяемый размер вектора.

Аргумент fill-pointer функции отслеживает количество элементов, фактически сохраненных в векторе. Это индекс следующей позиции, которая будет заполнена при добавлении элемента в вектор.

Функция векторного нажатия позволяет добавить элемент в конец изменяемого размера вектора. Увеличивает указатель заполнения на 1.

Функция vector-pop возвращает последний добавленный элемент и уменьшает указатель заполнения на 1.

пример

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

Live Demo

(setq a (make-array 5 :fill-pointer 0))
(write a)

(vector-push 'a a)
(vector-push 'b a)
(vector-push 'c a)

(terpri)
(write a)
(terpri)

(vector-push 'd a)
(vector-push 'e a)

;this will not be entered as the vector limit is 5
(vector-push 'f a)

(write a)
(terpri)

(vector-pop a)
(vector-pop a)
(vector-pop a)

(write a)

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

#()
#(A B C)
#(A B C D E)
#(A B)

Векторы являются последовательностями, все функции последовательности применимы для векторов. Пожалуйста, обратитесь к главе последовательностей, для векторных функций.