LISP - wektory

Wektory to jednowymiarowe tablice, a zatem podtyp tablicy. Wektory i listy nazywane są łącznie sekwencjami. Dlatego wszystkie funkcje generyczne sekwencji i funkcje tablicowe, które omówiliśmy do tej pory, działają na wektorach.

Tworzenie wektorów

Funkcja wektorów umożliwia tworzenie wektorów o stałym rozmiarze z określonymi wartościami. Pobiera dowolną liczbę argumentów i zwraca wektor zawierający te argumenty.

Przykład 1

Utwórz nowy plik kodu źródłowego o nazwie main.lisp i wpisz w nim następujący kod.

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

Po wykonaniu kodu zwraca następujący wynik -

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

Proszę zauważyć, że LISP używa składni # (...) jako dosłownej notacji wektorów. Możesz użyć tej składni # (...) do tworzenia i dołączania wektorów literałów do swojego kodu.

Są to jednak wektory dosłowne, więc modyfikowanie ich nie jest zdefiniowane w LISP. Dlatego do programowania zawsze należy używać rozszerzeniavector funkcja lub bardziej ogólna funkcja make-array do tworzenia wektorów, które planujesz modyfikować.

Plik make-arrayfunkcja jest bardziej ogólnym sposobem tworzenia wektora. Możesz uzyskać dostęp do elementów wektora za pomocąaref funkcjonować.

Przykład 2

Utwórz nowy plik kodu źródłowego o nazwie main.lisp i wpisz w nim następujący kod.

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

Po wykonaniu kodu zwraca następujący wynik -

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

Wskaźnik wypełnienia

Plik make-array Funkcja umożliwia utworzenie wektora o zmiennym rozmiarze.

Plik fill-pointerargument funkcji śledzi liczbę elementów faktycznie przechowywanych w wektorze. Jest to indeks następnej pozycji do wypełnienia po dodaniu elementu do wektora.

Plik vector-pushFunkcja umożliwia dodanie elementu na końcu wektora o zmiennym rozmiarze. Zwiększa wskaźnik wypełnienia o 1.

Plik vector-pop funkcja zwraca ostatnio wciśnięty element i zmniejsza wskaźnik wypełnienia o 1.

Przykład

Utwórz nowy plik kodu źródłowego o nazwie main.lisp i wpisz w nim następujący kod.

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

Po wykonaniu kodu zwraca następujący wynik -

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

Wektory są sekwencjami, wszystkie funkcje sekwencji mają zastosowanie do wektorów. Informacje na temat funkcji wektorowych można znaleźć w rozdziale Sekwencje.