El mapeo consiste en aplicar una función a cada elemento de una secuencia para producir una nueva secuencia.
mapcar puede usarse para mapear una función sobre una lista de objetos:
(mapcar #'double '(1 2 3 4)) ; => (2 4 6 8)
Fíjate en que el primer argumento es una función a la que llamar.
El #' es una sintaxis de citación especial para especificar una función.
(Se puede usar 'double aquí, pero el uso de #' es idiomático y, podría decirse, «más correcto».)
El mapeo no se limita a aplicar una función a una única secuencia; también puede hacerse con varias secuencias.
Si se proporcionan N secuencias, la función debe aceptar N argumentos.
(mapcar #'list '(1 2) '(a b) '("foo" "bar")) ; => ((1 a "foo") (2 b "bar"))
Además de mapcar, hay otras funciones para mapear sobre listas.
mapcar es sin duda la más común, pero conviene conocer las demás.
maplist funciona de forma similar a mapcar, pero opera sobre sublistas sucesivas en lugar de sobre elementos.
Primero sobre la lista entera, luego sobre cdr, después sobre el cdr de eso, etc.:
(maplist #'identity '(a b c)) ; => ((A B C) (B C) (C))
mapc y mapl son como mapcar y maplist, respectivamente, pero no recopilan los resultados; en su lugar, devuelven la primera lista.
Esto se usa para operaciones con efectos secundarios.
mapcan y mapcon son como mapcar y maplist, pero el resultado se aplana mediante el uso de nconc, que es como append pero destructivo con todos sus argumentos menos el último.
El mapeo no se limita a las listas. Se puede mapear sobre cualquier secuencia (tratada en otro concepto).
En el caso de secuencias que no son listas, se usa la función map.
map acepta 3 argumentos o más:
(map 'list #'double '(1 2 3)) ; => (2 4 6)
(map 'string #'char-upcase "foobar") ; => "FOOBAR"
Como caso especial, si se proporciona nil como tipo de la secuencia resultante, se devuelve nil.
Esto (igual que mapc y mapl más arriba) se usa para efectos secundarios.