El mapeo se refiere a la aplicación de una función a cada elemento de una secuencia para producir una nueva secuencia.
Con mapcar puedes mapear una función sobre una lista de objetos
(mapcar #'double '(1 2 3 4)) ; => (2 4 6 8)
Fíjate que el primer argumento es una función a la que llamar.
El #' es una sintaxis especial de citación para especificar una función.
(Aquí puedes usar 'double, pero el uso de #' es idiomático y, se podría decir, «más correcto».)
El mapeo no se limita a aplicar una función a una sola secuencia, sino que se puede hacer con varias secuencias.
Si se proporcionan N secuencias, la función debe recibir N argumentos.
(mapcar #'list '(1 2) '(a b) '("foo" "bar")) ; => ((1 a "foo") (2 b "bar"))
Además de mapcar, existen otras funciones para mapear sobre listas.
mapcar es sin duda la más común, pero es bueno conocer las demás.
maplist funciona de manera similar a mapcar, pero opera sobre sublistas sucesivas en lugar de elementos.
Primero sobre la lista completa, luego sobre el 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 recolectan 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 (que se cubre en otro concepto).
En el caso de secuencias que no son listas, se usa la función map.
map recibe 3 o más argumentos:
(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 secuencia resultante, se devuelve nil.
Esto (igual que mapc y mapl arriba) se usa para efectos secundarios.