LISP - Векторы
Векторы - это одномерные массивы, следовательно, это подтип массива. Векторы и списки вместе называются последовательностями. Поэтому все общие функции последовательностей и функции массивов, которые мы обсуждали до сих пор, работают с векторами.
Создание векторов
Векторная функция позволяет создавать векторы фиксированного размера с определенными значениями. Он принимает любое количество аргументов и возвращает вектор, содержащий эти аргументы.
Пример 1
Создайте новый файл исходного кода с именем main.lisp и введите в него следующий код.
(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 не определено. Поэтому для программирования всегда следует использоватьvector функция, или более общая функция make-array для создания векторов, которые вы планируете модифицировать.
В make-arrayфункция - это более общий способ создания вектора. Вы можете получить доступ к элементам вектора, используяaref функция.
Пример 2
Создайте новый файл исходного кода с именем main.lisp и введите в него следующий код.
(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Аргумент функции отслеживает количество элементов, фактически сохраненных в векторе. Это индекс следующей позиции, которую нужно заполнить, когда вы добавляете элемент в вектор.
В vector-pushФункция позволяет вам добавить элемент в конец вектора изменяемого размера. Увеличивает указатель заливки на 1.
В vector-pop Функция возвращает последний отправленный элемент и уменьшает указатель заполнения на 1.
пример
Создайте новый файл исходного кода с именем main.lisp и введите в него следующий код.
(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)
Векторы являются последовательностями, все функции последовательностей применимы к векторам. Пожалуйста, обратитесь к главе о последовательностях, чтобы узнать о векторных функциях.