LISP - Listas

Las listas habían sido la estructura de datos compuesta más importante y primaria en LISP tradicional. El Common LISP actual proporciona otras estructuras de datos como vector, tabla hash, clases o estructuras.

Las listas son listas vinculadas individuales. En LISP, las listas se construyen como una cadena de una estructura de registro simple denominadacons Unidos entre sí.

La estructura de registro de los contras

UN cons es una estructura de registro que contiene dos componentes llamados car y el cdr.

Las contras o contras son objetos que son pares de valores que se crean usando la función cons.

los consLa función toma dos argumentos y devuelve una nueva celda de cons que contiene los dos valores. Estos valores pueden ser referencias a cualquier tipo de objeto.

Si el segundo valor no es nulo, u otra celda de contras, los valores se imprimen como un par de puntos entre paréntesis.

Los dos valores en una celda de contras se denominan car y el cdr. los car La función se utiliza para acceder al primer valor y al cdr La función se utiliza para acceder al segundo valor.

Ejemplo

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

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

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

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

El ejemplo anterior muestra cómo se podrían utilizar las estructuras de contras para crear una única lista enlazada, por ejemplo, la lista (ABC) consta de tres celdas de contras enlazadas entre sí por sus cdrs .

En forma de diagrama, se podría expresar como:

Listas en LISP

Aunque las celdas contras se pueden usar para crear listas, sin embargo, construir una lista a partir de conslas llamadas a funciones no pueden ser la mejor solución. loslist La función se utiliza más bien para crear listas en LISP.

La función de lista puede tomar cualquier número de argumentos y, como es una función, evalúa sus argumentos.

los first y restlas funciones dan el primer elemento y el resto parte de una lista. Los siguientes ejemplos demuestran los conceptos.

Ejemplo 1

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

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

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

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

Ejemplo 2

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

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

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

"Hunger Game"

Funciones de manipulación de listas

La siguiente tabla proporciona algunas funciones de manipulación de listas de uso común.

No Señor. Función descriptiva
1

car

Toma una lista como argumento y devuelve su primer elemento.

2

cdr

Toma una lista como argumento y devuelve una lista sin el primer elemento

3

cons

Toma dos argumentos, un elemento y una lista y devuelve una lista con el elemento insertado en primer lugar.

4

list

Toma cualquier número de argumentos y devuelve una lista con los argumentos como elementos miembros de la lista.

5

append

Fusiona dos o más listas en una.

6

last

Toma una lista y devuelve una lista que contiene el último elemento.

7

member

Toma dos argumentos de los cuales el segundo debe ser una lista, si el primer argumento es miembro del segundo argumento, y luego devuelve el resto de la lista comenzando con el primer argumento.

8

reverse

Toma una lista y devuelve una lista con los elementos superiores en orden inverso.

Tenga en cuenta que todas las funciones de secuencia son aplicables a las listas.

Ejemplo 3

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

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

Cuando ejecuta el código, devuelve el siguiente 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)

Concatenación de funciones de coche y cdr

los car y cdr funciones y su combinación permite extraer cualquier elemento / miembro particular de una lista.

Sin embargo, las secuencias de funciones car y cdr se pueden abreviar concatenando la letra a para car y d para cdr dentro de las letras cy r.

Por ejemplo, podemos escribir cadadr para abreviar la secuencia de llamadas a funciones: car cdr car cdr.

Por lo tanto, (cadadr '(a (cd) (efg))) devolverá d

Ejemplo 4

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

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

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

D
A
(3 4)