LISP - Vetores

Vetores são matrizes unidimensionais, portanto, um subtipo de matriz. Vetores e listas são chamados coletivamente de sequências. Portanto, todas as funções genéricas de sequência e funções de matriz que discutimos até agora funcionam em vetores.

Criação de vetores

A função de vetor permite que você crie vetores de tamanho fixo com valores específicos. Leva qualquer número de argumentos e retorna um vetor contendo esses argumentos.

Exemplo 1

Crie um novo arquivo de código-fonte denominado main.lisp e digite o seguinte código nele.

(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 você executa o código, ele retorna o seguinte resultado -

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

Observe que o LISP usa a sintaxe # (...) como a notação literal para vetores. Você pode usar esta sintaxe # (...) para criar e incluir vetores literais em seu código.

No entanto, esses são vetores literais, portanto, modificá-los não é definido no LISP. Portanto, para programação, você deve sempre usar ovector função, ou a função mais geral make-array para criar vetores que você planeja modificar.

o make-arrayfunção é a forma mais genérica de criar um vetor. Você pode acessar os elementos do vetor usando oaref função.

Exemplo 2

Crie um novo arquivo de código-fonte denominado main.lisp e digite o seguinte código nele.

(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 você executa o código, ele retorna o seguinte resultado -

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

Ponteiro de preenchimento

o make-array função permite que você crie um vetor redimensionável.

o fill-pointerO argumento da função controla o número de elementos realmente armazenados no vetor. É o índice da próxima posição a ser preenchida quando você adiciona um elemento ao vetor.

o vector-pushA função permite adicionar um elemento ao final de um vetor redimensionável. Ele aumenta o ponteiro de preenchimento em 1.

o vector-pop A função retorna o item empurrado mais recentemente e diminui o ponteiro de preenchimento em 1.

Exemplo

Crie um novo arquivo de código-fonte denominado main.lisp e digite o seguinte código nele.

(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 você executa o código, ele retorna o seguinte resultado -

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

Vetores sendo sequências, todas as funções de sequência são aplicáveis ​​a vetores. Consulte o capítulo de sequências, para funções vetoriais.