LISP - Listas

As listas foram as mais importantes e a principal estrutura de dados compostos no LISP tradicional. O Common LISP atual fornece outras estruturas de dados como vetor, tabela de hash, classes ou estruturas.

Listas são listas com links únicos. No LISP, as listas são construídas como uma cadeia de uma estrutura de registro simples chamadacons ligados em conjunto.

A Estrutura do Registro Contras

UMA cons é uma estrutura de registro contendo dois componentes chamados de car e a cdr.

Células contras ou contras são objetos são pares de valores criados usando a função cons.

o consA função recebe dois argumentos e retorna uma nova célula cons contendo os dois valores. Esses valores podem ser referências a qualquer tipo de objeto.

Se o segundo valor não for nulo, ou outra célula cons, então os valores são impressos como um par pontilhado entre parênteses.

Os dois valores em uma célula cons são chamados de car e a cdr. o car função é usada para acessar o primeiro valor e o cdr função é usada para acessar o segundo valor.

Exemplo

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

(write (cons 1 2))
(terpri)
(write (cons 'a 'b))
(terpri)
(write (cons 1 nil))
(terpri)
(write (cons 1 (cons 2 nil)))
(terpri)
(write (cons 1 (cons 2 (cons 3 nil))))
(terpri)
(write (cons 'a (cons 'b (cons 'c nil))))
(terpri)
(write ( car (cons 'a (cons 'b (cons 'c nil)))))
(terpri)
(write ( cdr (cons 'a (cons 'b (cons 'c nil)))))

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

(1 . 2)
(A . B)
(1)
(1 2)
(1 2 3)
(A B C)
A
(B C)

O exemplo acima mostra como as estruturas de cons podem ser usadas para criar uma única lista vinculada, por exemplo, a lista (ABC) consiste em três células cons unidas por seus cdrs .

Diagramaticamente, pode ser expresso como -

Listas no LISP

Embora as células cons possam ser usadas para criar listas, no entanto, construir uma lista de conschamadas de função não podem ser a melhor solução. olist função é mais usada para criar listas no LISP.

A função de lista pode receber qualquer número de argumentos e, como é uma função, avalia seus argumentos.

o first e restfunções fornecem o primeiro elemento e a parte restante de uma lista. Os exemplos a seguir demonstram os conceitos.

Exemplo 1

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

(write (list 1 2))
(terpri)
(write (list 'a 'b))
(terpri)
(write (list 1 nil))
(terpri)
(write (list 1 2 3))
(terpri)
(write (list 'a 'b 'c))
(terpri)
(write (list 3 4 'a (car '(b . c)) (* 4 -2)))
(terpri)
(write (list (list 'a 'b) (list 'c 'd 'e)))

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

(1 2)
(A B)
(1 NIL)
(1 2 3)
(A B C)
(3 4 A B -8)
((A B) (C D E))

Exemplo 2

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

(defun my-library (title author rating availability)
   (list :title title :author author :rating rating :availabilty availability)
)

(write (getf (my-library "Hunger Game" "Collins" 9 t) :title))

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

"Hunger Game"

Lista de funções de manipulação

A tabela a seguir fornece algumas funções de manipulação de lista comumente usadas.

Sr. Não. Descrição da função
1

car

Ele recebe uma lista como argumento e retorna seu primeiro elemento.

2

cdr

Recebe uma lista como argumento e retorna uma lista sem o primeiro elemento

3

cons

Recebe dois argumentos, um elemento e uma lista, e retorna uma lista com o elemento inserido em primeiro lugar.

4

list

Recebe qualquer número de argumentos e retorna uma lista com os argumentos como elementos membros da lista.

5

append

Ele mescla duas ou mais listas em uma.

6

last

Ele pega uma lista e retorna uma lista contendo o último elemento.

7

member

Leva dois argumentos, dos quais o segundo deve ser uma lista, se o primeiro argumento for um membro do segundo argumento, e então retorna o restante da lista começando com o primeiro argumento.

8

reverse

Ele pega uma lista e retorna uma lista com os elementos principais na ordem inversa.

Observe que todas as funções de sequência são aplicáveis ​​às listas.

Exemplo 3

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

(write (car '(a b c d e f)))
(terpri)
(write (cdr '(a b c d e f)))
(terpri)
(write (cons 'a '(b c)))
(terpri)
(write (list 'a '(b c) '(e f)))
(terpri)
(write (append '(b c) '(e f) '(p q) '() '(g)))
(terpri)
(write (last '(a b c d (e f))))
(terpri)
(write (reverse '(a b c d (e f))))

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

A
(B C D E F)
(A B C)
(A (B C) (E F))
(B C E F P Q G)
((E F))
((E F) D C B A)

Concatenação de funções carro e cdr

o car e cdr funções e sua combinação permite extrair qualquer elemento / membro particular de uma lista.

No entanto, as sequências das funções car e cdr podem ser abreviadas concatenando a letra a para car ed para cdr dentro das letras c e r.

Por exemplo, podemos escrever cadadr para abreviar a sequência de chamadas de função - car cdr car cdr.

Assim, (cadadr '(a (cd) (efg))) retornará d

Exemplo 4

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

(write (cadadr '(a (c d) (e f g))))
(terpri)
(write (caar (list (list 'a 'b) 'c)))   
(terpri)
(write (cadr (list (list 1 2) (list 3 4))))
(terpri)

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

D
A
(3 4)