Ma

Mapeo en Common Lisp

12 ejercicios

Acerca de Mapeo

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».)

Más de una lista

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"))

Otras funciones de mapeo

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.

Mapeo sobre otras secuencias

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:

  • el primero es el tipo de la secuencia resultante
  • el segundo es la función que se va a aplicar
  • el tercero y los siguientes son las secuencias sobre las que se opera.
(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.

Editar en GitHub El enlace se abre en una ventana o pestaña nueva

Aprende Mapeo

La práctica está bloqueada

Desbloquea 8 ejercicios más para practicar Mapeo