LISP - Vettori
I vettori sono array unidimensionali, quindi un sottotipo di array. I vettori e gli elenchi sono chiamati collettivamente sequenze. Pertanto tutte le funzioni generiche di sequenza e le funzioni di array di cui abbiamo discusso finora, lavorano sui vettori.
Creazione di vettori
La funzione vettoriale consente di creare vettori di dimensioni fisse con valori specifici. Accetta un numero qualsiasi di argomenti e restituisce un vettore contenente tali argomenti.
Esempio 1
Crea un nuovo file di codice sorgente denominato main.lisp e digita il codice seguente.
(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)
Quando esegui il codice, restituisce il seguente risultato:
#(1 2 3 4 5)
#(A B C D E)
#(P Q R S T)
Si noti che LISP utilizza la sintassi # (...) come notazione letterale per i vettori. È possibile utilizzare questa sintassi # (...) per creare e includere vettori letterali nel codice.
Tuttavia, questi sono vettori letterali, quindi la loro modifica non è definita in LISP. Pertanto, per la programmazione, dovresti sempre usare ilvector funzione, o la funzione più generale make-array per creare vettori che intendi modificare.
Il make-arrayfunzione è il modo più generico per creare un vettore. È possibile accedere agli elementi vettoriali utilizzando ilaref funzione.
Esempio 2
Crea un nuovo file di codice sorgente denominato main.lisp e digita il codice seguente.
(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)
Quando esegui il codice, restituisce il seguente risultato:
#(0 1 2 3 4)
#(2 2 2 2 2)
Riempi puntatore
Il make-array consente di creare un vettore ridimensionabile.
Il fill-pointerL'argomento della funzione tiene traccia del numero di elementi effettivamente memorizzati nel vettore. È l'indice della posizione successiva da riempire quando aggiungi un elemento al vettore.
Il vector-pushla funzione consente di aggiungere un elemento alla fine di un vettore ridimensionabile. Aumenta il puntatore di riempimento di 1.
Il vector-pop la funzione restituisce l'elemento inserito più di recente e riduce il puntatore di riempimento di 1.
Esempio
Crea un nuovo file di codice sorgente denominato main.lisp e digita il codice seguente.
(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)
Quando esegui il codice, restituisce il seguente risultato:
#()
#(A B C)
#(A B C D E)
#(A B)
Essendo i vettori sequenze, tutte le funzioni di sequenza sono applicabili ai vettori. Consultare il capitolo sulle sequenze, per le funzioni vettoriali.