LISP - Vecteurs

Les vecteurs sont des tableaux unidimensionnels, donc un sous-type de tableau. Les vecteurs et les listes sont appelés collectivement séquences. Par conséquent, toutes les fonctions génériques de séquence et les fonctions de tableau dont nous avons discuté jusqu'à présent fonctionnent sur des vecteurs.

Création de vecteurs

La fonction vectorielle vous permet de créer des vecteurs de taille fixe avec des valeurs spécifiques. Il prend n'importe quel nombre d'arguments et renvoie un vecteur contenant ces arguments.

Exemple 1

Créez un nouveau fichier de code source nommé main.lisp et tapez le code suivant dedans.

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

Lorsque vous exécutez le code, il renvoie le résultat suivant -

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

Veuillez noter que LISP utilise la syntaxe # (...) comme notation littérale pour les vecteurs. Vous pouvez utiliser cette syntaxe # (...) pour créer et inclure des vecteurs littéraux dans votre code.

Cependant, ce sont des vecteurs littéraux, donc leur modification n'est pas définie dans LISP. Par conséquent, pour la programmation, vous devez toujours utiliser levector fonction, ou la fonction plus générale make-array pour créer des vecteurs que vous prévoyez de modifier.

le make-arrayest la manière la plus générique de créer un vecteur. Vous pouvez accéder aux éléments vectoriels en utilisant learef fonction.

Exemple 2

Créez un nouveau fichier de code source nommé main.lisp et tapez le code suivant dedans.

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

Lorsque vous exécutez le code, il renvoie le résultat suivant -

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

Pointeur de remplissage

le make-array La fonction vous permet de créer un vecteur redimensionnable.

le fill-pointerL'argument de la fonction garde la trace du nombre d'éléments réellement stockés dans le vecteur. C'est l'index de la prochaine position à remplir lorsque vous ajoutez un élément au vecteur.

le vector-pushLa fonction vous permet d'ajouter un élément à la fin d'un vecteur redimensionnable. Il augmente le pointeur de remplissage de 1.

le vector-pop La fonction renvoie l'élément le plus récemment poussé et décrémente le pointeur de remplissage de 1.

Exemple

Créez un nouveau fichier de code source nommé main.lisp et tapez le code suivant dedans.

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

Lorsque vous exécutez le code, il renvoie le résultat suivant -

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

Les vecteurs étant des séquences, toutes les fonctions de séquence sont applicables aux vecteurs. Veuillez consulter le chapitre séquences, pour les fonctions vectorielles.