LISP - Arrays

LISP permite que você defina matrizes de dimensão única ou múltipla usando o make-arrayfunção. Um array pode armazenar qualquer objeto LISP como seus elementos.

Todas as matrizes consistem em locais de memória contíguos. O endereço mais baixo corresponde ao primeiro elemento e o endereço mais alto ao último elemento.

O número de dimensões de uma matriz é chamado de classificação.

No LISP, um elemento de matriz é especificado por uma sequência de índices inteiros não negativos. O comprimento da sequência deve ser igual à classificação da matriz. A indexação começa do zero.

Por exemplo, para criar um array com 10 células, denominado my-array, podemos escrever -

(setf my-array (make-array '(10)))

A função aref permite acessar o conteúdo das células. Leva dois argumentos, o nome da matriz e o valor do índice.

Por exemplo, para acessar o conteúdo da décima célula, escrevemos -

(aref my-array 9)

Exemplo 1

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

(write (setf my-array (make-array '(10))))
(terpri)
(setf (aref my-array 0) 25)
(setf (aref my-array 1) 23)
(setf (aref my-array 2) 45)
(setf (aref my-array 3) 10)
(setf (aref my-array 4) 20)
(setf (aref my-array 5) 17)
(setf (aref my-array 6) 25)
(setf (aref my-array 7) 19)
(setf (aref my-array 8) 67)
(setf (aref my-array 9) 30)
(write my-array)

Quando você executa o código, ele retorna o seguinte resultado -

#(NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL)
#(25 23 45 10 20 17 25 19 67 30)

Exemplo 2

Vamos criar um array 3 por 3.

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

(setf x (make-array '(3 3) 
   :initial-contents '((0 1 2 ) (3 4 5) (6 7 8)))
)
(write x)

Quando você executa o código, ele retorna o seguinte resultado -

#2A((0 1 2) (3 4 5) (6 7 8))

Exemplo 3

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

(setq a (make-array '(4 3)))
(dotimes (i 4)
   (dotimes (j 3)
      (setf (aref a i j) (list i 'x j '= (* i j)))
   )
)
(dotimes (i 4)
   (dotimes (j 3)
      (print (aref a i j))
   )
)

Quando você executa o código, ele retorna o seguinte resultado -

(0 X 0 = 0) 
(0 X 1 = 0) 
(0 X 2 = 0) 
(1 X 0 = 0) 
(1 X 1 = 1) 
(1 X 2 = 2) 
(2 X 0 = 0) 
(2 X 1 = 2) 
(2 X 2 = 4) 
(3 X 0 = 0) 
(3 X 1 = 3) 
(3 X 2 = 6)

Sintaxe completa para a função make-array

A função make-array leva muitos outros argumentos. Vejamos a sintaxe completa desta função -

make-array dimensions :element-type :initial-element :initial-contents :adjustable :fill-pointer  :displaced-to :displaced-index-offset

Além do argumento de dimensões , todos os outros argumentos são palavras-chave. A tabela a seguir fornece uma breve descrição dos argumentos.

Sr. Não. Argumento e Descrição
1

dimensions

Ele fornece as dimensões da matriz. É um número para array unidimensional e uma lista para array multi-dimensional.

2

:element-type

É o especificador de tipo, o valor padrão é T, ou seja, qualquer tipo

3

:initial-element

Valor dos elementos iniciais. Ele fará um array com todos os elementos inicializados com um valor particular.

4

:initial-content

Conteúdo inicial como objeto.

5

:adjustable

Ajuda a criar um vetor redimensionável (ou ajustável) cuja memória subjacente pode ser redimensionada. O argumento é um valor booleano que indica se a matriz é ajustável ou não, o valor padrão sendo NIL.

6

:fill-pointer

Ele controla o número de elementos realmente armazenados em um vetor redimensionável.

7

:displaced-to

Ajuda na criação de uma matriz deslocada ou compartilhada que compartilha seu conteúdo com a matriz especificada. Ambos os arrays devem ter o mesmo tipo de elemento. A opção: displaced-to não pode ser usada com a opção: initial-element ou: initial-contents. Este argumento padrão é nulo.

8

:displaced-index-offset

Ele fornece o deslocamento de índice do array compartilhado criado.

Exemplo 4

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

(setq myarray (make-array '(3 2 3) 
   :initial-contents 
   '(((a b c) (1 2 3)) 
      ((d e f) (4 5 6)) 
      ((g h i) (7 8 9)) 
   ))
) 
(setq array2 (make-array 4 :displaced-to myarray :displaced-index-offset 2)) 
(write myarray)
(terpri)
(write array2)

Quando você executa o código, ele retorna o seguinte resultado -

#3A(((A B C) (1 2 3)) ((D E F) (4 5 6)) ((G H I) (7 8 9)))
#(C 1 2 3)

Se a matriz deslocada for bidimensional -

(setq myarray (make-array '(3 2 3) 
   :initial-contents 
   '(((a b c) (1 2 3)) 
      ((d e f) (4 5 6)) 
      ((g h i) (7 8 9)) 
   ))
) 
(setq array2 (make-array '(3 2) :displaced-to myarray :displaced-index-offset 2)) 
(write myarray)
(terpri)
(write array2)

Quando você executa o código, ele retorna o seguinte resultado -

#3A(((A B C) (1 2 3)) ((D E F) (4 5 6)) ((G H I) (7 8 9)))
#2A((C 1) (2 3) (D E))

Vamos mudar o deslocamento do índice deslocado para 5 -

(setq myarray (make-array '(3 2 3) 
   :initial-contents 
   '(((a b c) (1 2 3)) 
      ((d e f) (4 5 6)) 
      ((g h i) (7 8 9)) 
   ))
) 
(setq array2 (make-array '(3 2) :displaced-to myarray :displaced-index-offset 5)) 
(write myarray)
(terpri)
(write array2)

Quando você executa o código, ele retorna o seguinte resultado -

#3A(((A B C) (1 2 3)) ((D E F) (4 5 6)) ((G H I) (7 8 9)))
#2A((3 D) (E F) (4 5))

Exemplo 5

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

;a one dimensional array with 5 elements, 
;initail value 5
(write (make-array 5 :initial-element 5))
(terpri)

;two dimensional array, with initial element a
(write (make-array '(2 3) :initial-element 'a))
(terpri)

;an array of capacity 14, but fill pointer 5, is 5
(write(length (make-array 14 :fill-pointer 5)))
(terpri)

;however its length is 14
(write (array-dimensions (make-array 14 :fill-pointer 5)))
(terpri)

; a bit array with all initial elements set to 1
(write(make-array 10 :element-type 'bit :initial-element 1))
(terpri)

; a character array with all initial elements set to a
; is a string actually
(write(make-array 10 :element-type 'character :initial-element #\a)) 
(terpri)

; a two dimensional array with initial values a
(setq myarray (make-array '(2 2) :initial-element 'a :adjustable t))
(write myarray)
(terpri)

;readjusting the array
(adjust-array myarray '(1 3) :initial-element 'b) 
(write myarray)

Quando você executa o código, ele retorna o seguinte resultado -

#(5 5 5 5 5)
#2A((A A A) (A A A))
5
(14)
#*1111111111
"aaaaaaaaaa"
#2A((A A) (A A))
#2A((A A B))