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