Ma

Mapeamento em Common Lisp

12 exercícios

Sobre Mapeamento

Mapeamento é a aplicação de uma função a cada elemento de uma sequência para produzir uma nova sequência.

mapcar pode ser usado para mapear uma função por uma lista de objetos

(mapcar #'double '(1 2 3 4)) ; => (2 4 6 8)

Repare que o primeiro argumento é uma função a ser chamada. O #' é uma sintaxe especial de quoting para especificar uma função. (Você pode usar 'double aqui, mas o uso de #' é idiomático e, pode-se argumentar, "mais correto".)

Mais de uma lista

O mapeamento não se limita a aplicar uma função a uma única sequência: ele também pode ser feito com várias sequências. Se N sequências forem fornecidas, a função precisa receber N argumentos.

(mapcar #'list '(1 2) '(a b) '("foo" "bar")) ; => ((1 a "foo") (2 b "bar"))

Outras funções de mapeamento

Além de mapcar, existem outras funções para mapear por listas. mapcar é com certeza a mais comum, mas é bom conhecer as outras.

maplist funciona de forma parecida com mapcar, mas opera sobre sublistas sucessivas em vez de elementos. Primeiro sobre a lista inteira, depois sobre o cdr, depois sobre o cdr disso, e assim por diante:

(maplist #'identity '(a b c)) ; => ((A B C) (B C) (C))

mapc e mapl são como mapcar e maplist, respectivamente, mas não coletam os resultados e, em vez disso, retornam a primeira lista. Isso é usado para operações com efeitos colaterais.

mapcan e mapcon são como mapcar e maplist, mas o resultado é achatado pelo uso de nconc, que é parecido com append, mas destrutivo para todos os argumentos, exceto o último.

Mapeamento em outras sequências

O mapeamento não se limita a listas. Qualquer sequência (abordada em outro conceito) pode ser mapeada. No caso de sequências que não são listas, usa-se a função map.

map recebe 3 ou mais argumentos:

  • o primeiro é o tipo da sequência resultante
  • o segundo é a função a aplicar
  • o terceiro e os demais são as sequências sobre as quais operar.
(map 'list #'double '(1 2 3))        ; => (2 4 6)
(map 'string #'char-upcase "foobar") ; => "FOOBAR"

Como caso especial, se nil for fornecido como tipo da sequência resultante, então nil é retornado. Isso (assim como mapc e mapl acima) é usado para efeitos colaterais.

Editar via GitHub O link abre em uma nova janela ou aba

Aprenda Mapeamento

A prática está bloqueada

Desbloqueie mais 8 exercícios para praticar Mapeamento