El mapeo consiste en aplicar una función a cada elemento de una secuencia para producir una nueva secuencia.
Esto se puede hacer fácilmente sobre una lista con la función mapcar.
Supongamos que tenemos una función double que multiplica su argumento por 2:
(mapcar #'double '(1 2 3 4)) ; => (2 4 6 8)
Fíjate en que el primer argumento es una función que hay que llamar. El #' es una sintaxis especial de cita para especificar una función.
Primero se llamó a double con el primer elemento, luego con el segundo, etc.
Los resultados se recopilaron en una lista, que es el valor al que se evalúa la expresión.
El filtrado es el proceso de crear una secuencia a partir de otra copiando todos los elementos de la secuencia original salvo algunos. La elección de qué elementos incluir en la nueva secuencia se puede hacer mediante una función predicado (una función que se evalúa a un valor booleano) o mediante la igualdad con un objeto concreto.
remove-if es una función que toma una función predicado y una secuencia como argumentos, y devuelve una secuencia formada solo por aquellos elementos para los que el predicado se evaluó a un valor falso.
En otras palabras, «elimina» todos los elementos de la secuencia para los que el predicado se evalúa como verdadero. No obstante, ten en cuenta que esta función no modifica la secuencia original.
En su lugar, devuelve una nueva secuencia sin los elementos correspondientes. Si el predicado era verdadero para todos los valores, se devuelve una secuencia vacía.
(remove-if #'evenp '(1 2 3 4 5)) ; => (1 3 5)
(remove-if #'oddp '(1 3 5)) ; => ()
Si quieres eliminar un elemento concreto de una secuencia, puedes usar remove, que toma el elemento que hay que eliminar y una secuencia.
Se devuelven todos los valores de la secuencia que no son iguales al elemento que se quiere eliminar.
NOTA: por defecto, la igualdad se comprueba con el predicado de igualdad genérico eql.
(remove 1 '(1 2 1 3 1 4)) ; => (2 3 4)
(remove #\l "hello") ; => "heo"
A Lucy, la alienígena Lisp, le gustan los números y piensa que algunos son «magníficos».
Te pide ayuda para escribir funciones que hagan que los números sean más magníficos.
Lo que Lucy piensa que hace que un número sea magnífico puede cambiar, así que las funciones tendrán que ser flexibles.
Para convertir un array de números en un array de números más magníficos, tendrás que escribir una función make-magnificent-maybe que reciba una función que se aplique a los números y un array de números.
Debería evaluarse a un array de números que sean más magníficos (según la función proporcionada).
(make-magnificent-maybe #'square '(1 2 3)) ; => (1 4 9)
(make-magnificent-maybe #'1+ '(1 2 3)) ; => (2 3 4)
Después de (con suerte) hacer que los números sean más magníficos, Lucy solo quiere ver los números que son verdaderamente magníficos.
Sabe con certeza que el 1 nunca es magnífico, así que tendrás que eliminarlo sin más.
Pero aparte de eso, Lucy cambia de opinión a veces, así que de nuevo te dará una función que te dirá si un número es magnífico o no.
Tendrás que escribir una función only-the-best que reciba una función y un array de números y devuelva solo los mejores números (ni 1 ni números para los que la función se evalúe como verdadero).
(only-the-best #'evenp '(1 2 3 4 5)) ; => (3 5)
(only-the-best #'oddp '(1 3 5)) ; => ()
Regístrate en Exercism para aprender y dominar Common Lisp con 27 conceptos92 ejercicios y mentoría humana real, todo gratis.