Dado que el nombre del lenguaje que usamos, Lisp, significa LIST Processing, se podría suponer que el lenguaje tiene herramientas para manejar listas de elementos, ¡y tienes razón!
Aunque Common Lisp tiene otras estructuras de datos además de las listas, las listas se siguen usando mucho.
Una lista en Common Lisp es una secuencia de elementos. También se le llama cons (sobre todo por razones históricas).
Los elementos en sí no tienen que ser del mismo tipo.
Por ejemplo, puedes tener una lista con 1, two, "III".
Puedes simplemente escribir una lista citada así: '(1 two "III"), y eso hará que se cree y se evalúe una lista (se evalúa a (1 two "III")).
También hay dos funciones principales que se usan para crear listas: list y cons.
list recibe cero o más argumentos y se evalúa a una lista creada con esos valores:
(list 1 'two "III") ; => (1 two "III")
cons recibe dos elementos y crea una lista que tiene el primer elemento como su car (la cabeza de la lista) y el segundo elemento como su cdr (el resto de la lista):
(cons 1 2) ; => (1 . 2) ;; (a list without `nil` as its `cdr` is printed in this way)
(cons 1 nil) ; => (1)
(cons 1 (cons 2 nil)) ; => (1 2)
Las funciones car y cdr se pueden usar para acceder al car y al cdr de una lista.
(first y rest son sinónimos de car y cdr y funcionan exactamente igual).
La longitud de una lista se puede determinar con length.
Una lista vacía tiene longitud cero.
Se puede acceder a un elemento cualquiera con nth (ten en cuenta que las listas están indexadas desde cero).
No es un error pedir un índice mayor que la longitud de la lista.
En cambio, se evalúa a nil:
(nth 23 '(short list)) ; => nil
También hay varios métodos auxiliares para acceder a los primeros elementos de una lista: first, second, third, y así hasta tenth. Qué práctico, ¿no?
Se pueden combinar dos o más listas con append:
(append '(a b c) '(1 2 3)) ; => (A B C 1 2 3)
(append '(a b c) '()) ; => (A B C)
Cada argumento que se le pasa a append tiene que ser una lista.
Leslie, el alienígena de Lisp, necesita hacer unas compras. Es muy importante tener una lista de compras. Hay que agregarle cosas y quitarle cosas.
Claro que un simple lápiz y papel no sirven para un alienígena de Lisp. ¡Si hasta «list» es casi toda la palabra «Lisp»! Tienen que haber funciones escritas que ayuden a llevar el control de las compras.
¿Puedes ayudar a Leslie a llevar el control de la lista de compras?
Lo primero es que Leslie necesita crear una lista vacía. Una función llamada new-list sería perfecta para eso.
(new-list) ; => ()
Ay no... Leslie ya tiene algunas cosas en mente, así que necesita una función que tome tres cosas (por suerte Leslie solo crea una lista de tres cosas. ¡Ni más ni menos!) y que cree una nueva lista de compras con esas cosas. Escribe una función, list-of-things, que tome tres cosas y devuelva una lista con ellas.
(list-of-things 'bread 'milk 'butter) ; => '(bread milk butter)
Antes de ir a la tienda, Leslie revisa la despensa para ver qué necesita. Ayúdale escribiendo la función add-to-list, que agrega un elemento al principio de una lista.
(add-to-list 'butter '(bread)) ; => '(butter bread)
Mientras compra, Leslie quiere saber qué buscar después. También le gusta echar un vistazo a la lista para ver la segunda, la tercera o incluso la vigésima tercera cosa (su número de la suerte).
first-thing se evalúa como la primera cosa de la listasecond-thing se evalúa como la segunda cosathird-thing se evalúa como la tercera cosatwenty-third-thing se evalúa como la vigésima tercera cosa(first-thing '(bread butter milk)) ; => 'bread
(second-thing '(bread butter milk)) ; => 'butter
(third-thing '(bread butter milk)) ; => 'milk
Leslie quiere encontrar la primera cosa de la lista y quitarla del estante.
Ayúdale escribiendo una función remove-first-item que se evalúe como una lista con todo menos la primera cosa de la lista que recibe.
(remove-first-item '(bread butter milk)) ; => '(butter milk)
¡Leslie se dio cuenta de que por accidente hizo dos listas de compras, no una! Escribe una función, list-append, que devuelva una lista con los elementos de la primera lista seguidos por los de la segunda.
(list-append '(bread salt) '(butter milk)) ; => '(bread salt butter milk)
Leslie está empezando a preocuparse de que esta ida a la tienda tome un buen rato. ¿Cuántas cosas hay en esta lista, exactamente? Escribe una función just-how-long que le diga qué tan larga es su lista.
(just-how-long '(bread milk butter salt)) ; => 4
Regístrate en Exercism para aprender y dominar Common Lisp con 27 conceptos92 ejercicios y mentoría humana real, todo gratis.