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».)
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"))
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.
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:
(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.