2.2.2. Funciones de Acceso a Listas


Existen tres funciones básicas para acceder a los términos de una lista: CAR, QUOTE y CDR.

Funciones CAR y QUOTE:

CAR

CAR admite un único argumento que debe ser una lista o una expresión cuyo valor sea una lista y devuelve el primer elemento de dicha lista. Como LISP siempre interpreta una lista como una llamada a una función, necesitamos una manera de pasar una lista a CAR sin que LISP trate de procesarla como llamada a función.

QUOTE

Con este objetivo se suministra la función QUOTE . Una lista dentro de una función QUOTE no se tratará de evaluar como llamada a una función. La llamada a la función QUOTE se puede abreviar utilizando el signo apóstrofe <>.

Funciones CDR y NTH:

CDR recibe también una lista y devuelve el resto de la lista después de eliminar el primer elemento (CAR lista). Por lo tanto puede contemplarse como la función complementaria de CAR. Una manera de interpretar una lista en LISP es como la conjunción de un CAR y un CDR. Se podrá acceder a cualquier término de una lista mediante los anidamientos apropiados de CAR y CDR.
  • (CAR lista) ;primer término
  • (CAR (CDR lista)) ;segundo término
  • (CAR (CDR (CDR lista))) ;tercer término
y así sucesivamente... Para simplificar las expresiones se permite crear nombres compuestos para anidamientos de CAR y CDR de la siguiente manera:
  • comenzando por una primera letra C
  • una letra A por cada CAR o una D por cada CDR
  • terminando con una letra R
  • así (CAR (CDR (CDR lista))) sería lo mismo que (CADDR lista).
De esta manera podemos construir hasta 28 funciones distintas para acceso a listas. Según Johnson* estas 28 concatenaciones se pueden dividir en cuatro grupos, tomando como base la profundidad a que pueden acceder en listas anidadas en varios niveles.

Funciones de acceso al nivel superior:


Funciones de acceso al segundo nivel de anidamiento:


Funciones de acceso al tercer nivel de anidamiento:


Funciones de acceso al cuarto nivel de anidamiento:


Por supuesto, que estas funciones pueden a su vez combinarse para acceder a niveles aún más profundos de anidación.

NTH


NTH permite simplificar estas expresiones para listas muy largas:
  • (nth n lista)
Donde el argumento n es el número del elemento que debe devolverse (cero es el primer elemento). Si n es mayor que el número de elemento mayor de la lista, NTH devuelve nil .

EJEMPLOS:

De lo antes expuesto resultaría:

_$ (car '(a b c)) ;Caso de una lista normal
A
_$ (cdr '(a b c))
(B C)
_$ (cddr '(a b c))
(D)
_$ (cdddr '(a b c)) ;el último objeto es una lista vacía
nil
_$ (car '(a b . c)) ;Caso en que la lista termina en un par punteado
A
_$ (cdr '(a b . c))
(B . C)
_$ (cddr '(a b . c))
C ;el último objeto de la lista no es un CONS
_$ (cdddr '(a b . c)) ;lo que provoca un error
; error: bad argument type: consp C
_1$

* Johnson, Nelson. AutoCAD: Manual de Referencia. Osborne/McGraw-Hill, Madrid, 1990. ISBN 84-7615-451-8