O mapeamento é a aplicação de uma função a cada elemento de uma sequência, para produzir uma nova sequência.
Isto pode ser feito facilmente numa lista com a função mapcar.
Vamos supor que temos uma função double que multiplica o seu argumento por 2:
(mapcar #'double '(1 2 3 4)) ; => (2 4 6 8)
Repara que o primeiro argumento é uma função a chamar. O #' é uma sintaxe especial de quoting para especificar uma função.
O double foi chamado primeiro com o primeiro elemento, depois com o segundo, e assim por diante.
Os resultados foram reunidos numa lista, que é o valor para o qual a expressão é avaliada.
A filtragem é o processo de criar uma sequência a partir de outra, copiando da sequência original todos os elementos exceto alguns. A escolha dos elementos a incluir na nova sequência pode ser feita através de uma função de predicado (uma função que é avaliada para um valor Boolean), ou por igualdade com um objeto específico.
O remove-if é uma função que recebe, como argumentos, uma função de predicado e uma sequência, e devolve uma sequência apenas com os elementos para os quais o predicado foi avaliado como falso.
Por outras palavras, "remove" todos os elementos da sequência para os quais o predicado é verdadeiro. No entanto, repara que esta função não modifica a sequência original!
Em vez disso, devolve uma nova sequência sem os elementos em causa. Se o predicado for verdadeiro para todos os valores, é devolvida uma sequência vazia.
(remove-if #'evenp '(1 2 3 4 5)) ; => (1 3 5)
(remove-if #'oddp '(1 3 5)) ; => ()
Se quiseres remover um item específico de uma sequência, podes usar o remove, que recebe o item a remover e uma sequência.
São devolvidos todos os valores da sequência que não sejam iguais ao item a remover.
NOTA: por omissão, a igualdade é verificada com o eql, o predicado genérico de igualdade.
(remove 1 '(1 2 1 3 1 4)) ; => (2 3 4)
(remove #\l "hello") ; => "heo"
A Lucy, a alienígena de Lisp, gosta de números e acha que alguns deles são "magníficos".
Ela pede-te ajuda para escrever funções que tornem os números mais magníficos.
O que a Lucy acha que torna um número magnífico pode mudar, por isso as funções têm de ser flexíveis.
Para transformar uma lista de números numa lista de números mais magníficos, vais precisar de escrever uma função make-magnificent-maybe que recebe uma função a aplicar aos números e uma lista de números.
Deve resultar numa lista de números mais magníficos (de acordo com a função fornecida).
(make-magnificent-maybe #'square '(1 2 3)) ; => (1 4 9)
(make-magnificent-maybe #'1+ '(1 2 3)) ; => (2 3 4)
Depois de (esperemos) tornar os números mais magníficos, a Lucy quer ver apenas os números que são verdadeiramente magníficos.
Ela sabe com toda a certeza que 1 nunca é magnífico, por isso vais precisar de o remover.
Mas, fora isso, a Lucy muda de ideias às vezes, por isso, mais uma vez, vai dar-te uma função que te diz se um número é magnífico ou não.
Vais precisar de escrever uma função only-the-best que recebe uma função e uma lista de números e devolve apenas os melhores números (não o 1 e não os números para os quais a função devolve verdadeiro).
(only-the-best #'evenp '(1 2 3 4 5)) ; => (3 5)
(only-the-best #'oddp '(1 3 5)) ; => ()
Inscreve-te no Exercism para aprenderes e dominares Common Lisp com 27 conceitos92 exercícios, e mentoria humana real, tudo grátis.