LISP - Vectores

Los vectores son matrices unidimensionales, por lo tanto, un subtipo de matriz. Los vectores y las listas se denominan colectivamente secuencias. Por lo tanto, todas las funciones genéricas de secuencia y funciones de matriz que hemos discutido hasta ahora, funcionan en vectores.

Crear vectores

La función de vector le permite crear vectores de tamaño fijo con valores específicos. Toma cualquier número de argumentos y devuelve un vector que contiene esos argumentos.

Ejemplo 1

Cree un nuevo archivo de código fuente llamado main.lisp y escriba el siguiente código en él.

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

Cuando ejecuta el código, devuelve el siguiente resultado:

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

Tenga en cuenta que LISP utiliza la sintaxis # (...) como notación literal para los vectores. Puede usar esta sintaxis # (...) para crear e incluir vectores literales en su código.

Sin embargo, estos son vectores literales, por lo que modificarlos no está definido en LISP. Por lo tanto, para programar, siempre debe usar elvector función, o la función más general make-array para crear los vectores que planea modificar.

los make-arrayLa función es la forma más genérica de crear un vector. Puede acceder a los elementos vectoriales utilizando elaref función.

Ejemplo 2

Cree un nuevo archivo de código fuente llamado main.lisp y escriba el siguiente código en él.

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

Cuando ejecuta el código, devuelve el siguiente resultado:

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

Puntero de relleno

los make-array La función le permite crear un vector de tamaño variable.

los fill-pointerEl argumento de la función realiza un seguimiento del número de elementos realmente almacenados en el vector. Es el índice de la siguiente posición que se debe llenar cuando agrega un elemento al vector.

los vector-pushLa función le permite agregar un elemento al final de un vector de tamaño variable. Aumenta el puntero de relleno en 1.

los vector-pop La función devuelve el elemento introducido más recientemente y reduce el puntero de relleno en 1.

Ejemplo

Cree un nuevo archivo de código fuente llamado main.lisp y escriba el siguiente código en él.

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

Cuando ejecuta el código, devuelve el siguiente resultado:

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

Siendo vectores secuencias, todas las funciones de secuencia son aplicables para vectores. Consulte el capítulo de secuencias, para funciones vectoriales.