2.2.3. Funciones de Construcción de Listas


La función CONS

CONS es el constructor de lista básico. Construye listas insertando elementos en listas existentes (incluso vacías). El nuevo elemento ocupa el primer lugar de la lista (CAR lista).

(cons nuevo_elemento lista)

El nuevo_elemento puede ser un átomo o una lista.
La función CONS también acepta un átomo en lugar del argumento lista, en cuyo caso construye una estructura denominada par punteado. El CDR de un par punteado es el segundo término ya extraído de la lista, es decir, sin los paréntesis.
Ejemplo: (cons 'a 'b) devuelve (A . B) y (cdr '(a . b)) devuelve B.

Debe tenerse en cuenta que CONS, al igual que casi todas las funciones LISP es una función no destructiva, es decir que no altera los argumentos que recibe. Así que para conservar la lista con el nuevo primer elemento, será necesario utilizar SETQ. La función más general para incorporar nuevos elementos a una lista sería entonces:

(setq nombre_lista (cons nuevo_elemento nombre_lista))

donde nombre_lista sería el símbolo asociado al objeto lista. la función opera aunque nombre_lista no hubiera sido previamente asociado a una lista, pues no debemos olvidar que un símbolo no asociado se evalúa como NIL, que es, a su vez, equivalente a una lista vacía.
Ejemplo:

_$ (cons 'a 'b)
(A . B)
_$ (cons 'a (cons 'b (cons 'c '())))
(A B C)
_$ (cons 'a '(b c d))
(A B C D)

Funciones de ejemplo usando CONS/CAR/CDR

La función LIST

(list expr ...)

LIST Recupera cualquier número de expresiones y las combina en una lista. Admite tanto átomos como listas. Si uno de los agumentos es una lista vacía NIL aparecerá como uno de los términos de la lista.
Ejemplo:

_$ (list 3 4 'a (car '(b . c)) (+ 6 -2))
(3 4 A B 4)
_$ (list (list 'a 'b) (list 'c 'd 'e))
((A B) (C D E))

La función APPEND

(append lista lista ...)

APPEND Se utiliza para combinar listas. Elimina el primer nivel de anidación de cada una de las listas que recibe para combinar todas en una misma lista. Si una de las listas que recibe está vacía esta lista no aparecerá en la lista resultante.
Ejemplo:

_$ (append '(a b c) '(d e f) '() '(g))
(A B C D E F G)

Una muestra de la utilización de APPEND para eliminar las sublistas vacías:

_$ (apply 'append '(("M") ("a") nil ("r") ("i") nil))
("M" "a" "r" "i")