Como o nome da linguagem que estamos usando, Lisp, vem de LIST Processing (processamento de listas), dá para supor que ela tenha recursos para lidar com listas de itens. E você tem razão!
Embora o Common Lisp tenha outras estruturas de dados além das listas, as listas ainda são muito usadas.
Uma lista em Common Lisp é uma sequência de itens. Ela também é chamada de cons (na maioria das vezes, por razões históricas).
Os próprios itens não precisam ser do mesmo tipo.
Por exemplo, você pode ter uma lista com 1, two, "III".
Você pode simplesmente digitar uma lista com aspas assim: '(1 two "III"), e isso fará com que uma lista seja criada e avaliada (ela é avaliada como (1 two "III")).
Também há duas funções principais usadas para criar listas: list e cons.
list recebe zero ou mais argumentos e é avaliada como uma lista criada com esses valores:
(list 1 'two "III") ; => (1 two "III")
cons recebe dois itens e cria uma lista que tem o primeiro item como seu car (a cabeça da lista) e o segundo item como seu cdr (o resto da 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)
As funções car e cdr podem ser usadas para acessar o car e o cdr de uma lista.
(first e rest são sinônimos de car e cdr e funcionam exatamente do mesmo jeito.)
O comprimento de uma lista pode ser determinado com o uso de length.
Uma lista vazia tem comprimento zero.
Um item qualquer pode ser acessado com nth (repare que as listas têm índice começando em zero).
Não é um erro pedir um índice maior do que o comprimento da lista.
Em vez disso, ela é avaliada como nil:
(nth 23 '(short list)) ; => nil
Também existem vários métodos auxiliares para acessar os primeiros itens de uma lista: first, second, third, e assim por diante até tenth. Legal, né?
Duas ou mais listas podem ser combinadas com append:
(append '(a b c) '(1 2 3)) ; => (A B C 1 2 3)
(append '(a b c) '()) ; => (A B C)
Cada argumento passado para append precisa ser uma lista.
Leslie, o alienígena do Lisp, precisa fazer umas compras. É muito importante ter uma lista de compras. É preciso adicionar coisas a ela e remover coisas dela.
Claro que papel e caneta não bastam para um alienígena do Lisp. "List" já é a maior parte da palavra "Lisp"! Deve haver algumas funções escritas para ajudar a acompanhar as compras.
Você pode ajudar Leslie a acompanhar a lista de compras?
A primeira coisa é que Leslie precisa criar uma lista vazia. Uma função chamada new-list seria perfeita para isso.
(new-list) ; => ()
Oh, não... Leslie já tem algumas coisas em mente, então precisa de uma função que receba três itens (por sorte, Leslie só cria listas de três itens. Nem mais, nem menos!) e crie uma nova lista de compras com essas coisas. Escreva uma função, list-of-things, que receba três itens e retorne uma lista com eles.
(list-of-things 'bread 'milk 'butter) ; => '(bread milk butter)
Antes de ir à loja, Leslie olha na despensa para ver do que precisa. Ajude escrevendo a função add-to-list, que adiciona um item ao início de uma lista.
(add-to-list 'butter '(bread)) ; => '(butter bread)
Enquanto faz compras, Leslie quer saber o que procurar em seguida. Também gosta de espiar a lista para ver o segundo, o terceiro ou até o 23º item (o número da sorte da Leslie).
first-thing resulta na primeira coisa da listasecond-thing resulta na segunda coisathird-thing resulta na terceira coisatwenty-third-thing resulta na vigésima terceira coisa(first-thing '(bread butter milk)) ; => 'bread
(second-thing '(bread butter milk)) ; => 'butter
(third-thing '(bread butter milk)) ; => 'milk
Leslie quer encontrar o primeiro item da lista e removê-lo da prateleira.
Ajude escrevendo uma função remove-first-item que resulta em uma lista com tudo, menos o primeiro item da lista de entrada.
(remove-first-item '(bread butter milk)) ; => '(butter milk)
Leslie percebeu que fez duas listas de compras sem querer, em vez de uma só! Escreva uma função, list-append, que retorna uma lista com os elementos da primeira lista seguidos pelos da segunda lista.
(list-append '(bread salt) '(butter milk)) ; => '(bread salt butter milk)
Leslie está começando a se preocupar que essa ida às compras vai demorar. Mas afinal, quantas coisas tem nesta lista? Escreva uma função just-how-long para informar qual é o tamanho da lista.
(just-how-long '(bread milk butter salt)) ; => 4
Crie sua conta no Exercism para aprender e dominar Common Lisp com 27 conceitos92 exercícios e mentoria humana de verdade, tudo de graça.