Ma

Mapeamento em Common Lisp

12 exercícios

Sobre Mapeamento

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

Podes usar o mapcar para aplicar uma função a uma lista de objetos:

(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 citação para especificar uma função. (Podes usar 'double aqui, mas o uso de #' é idiomático e, discutivelmente, «mais correto».)

Mais do que uma lista

O mapeamento não se limita a aplicar uma função a uma única sequência: também podes fazê-lo com várias sequências. Se forneceres N sequências, a função tem de aceitar N argumentos.

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

Outras funções de mapeamento

Para além do mapcar, existem outras funções para aplicar a listas. O mapcar é claramente o mais comum, mas é bom conhecer os outros.

O maplist funciona de forma semelhante ao mapcar, mas opera sobre sublistas sucessivas em vez de elementos. Primeiro sobre a lista inteira, depois sobre o cdr, depois sobre o cdr desse, e assim por diante:

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

O mapc e o mapl são como o mapcar e o maplist, respetivamente, mas não recolhem os resultados: devolvem antes a primeira lista. Isto usa-se para operações com efeitos secundários.

O mapcan e o mapcon são como o mapcar e o maplist, mas o resultado é achatado através do nconc, que é como o append, mas destrutivo para todos os argumentos menos o último.

Mapear outras sequências

O mapeamento não se limita às listas. Podes mapear qualquer sequência (abordada noutro conceito). No caso de sequências que não são listas, usa-se a função map.

A função map aceita 3 ou mais argumentos:

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

Como caso especial, se forneceres nil como tipo da sequência resultante, o resultado devolvido é nil. Isto (tal como o mapc e o mapl acima) usa-se para efeitos secundários.

Editar via GitHub A ligação abre numa nova janela ou separador

Aprende Mapeamento

A prática está bloqueada

Desbloqueia mais 8 exercícios para praticares Mapeamento