2.2.2. Funciones de Acceso a Listas


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

Funciones CAR y QUOTE:

CAR

CAR admite un único argumento que debe ser una lista o unaexpresión cuyo valor sea una lista y devuelve el primer elemento dedicha lista. Como LISP siempre interpreta una lista como una llamada a unafunció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 setratará de evaluar como llamada a una función. La llamada a lafunción QUOTE se puede abreviar utilizando el signoapóstrofe <>.

Funciones CDR y NTH:

CDR recibe también una lista y devuelveel resto de la lista después de eliminar el primer elemento (CARlista). Por lo tanto puede contemplarse como la funcióncomplementaria de CAR. Una manera de interpretar una lista en LISP escomo la conjunción de un CAR y un CDR. Se podráacceder a cualquier término de una lista mediante los anidamientosapropiados 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 permitecrear nombres compuestos para anidamientos de CAR y CDR de lasiguiente 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 alistas. 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 aniveles aún más profundos de anidación.

NTH


NTH permite simplificar estas expresiones paralistas muy largas:
  • (nth n lista)
Donde el argumento n es el número del elemento que debedevolverse (cero es el primer elemento). Si n es mayor que elnú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