El mapeo se refiere a la aplicación de una función a cada elemento de una secuencia para producir una nueva secuencia.
Esto se puede hacer fácilmente en 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 que el primer argumento es una función que se debe llamar. El #' es una sintaxis especial de citación para especificar una función.
Se llamó a double primero con el primer elemento, luego con el segundo, etc.
Los resultados se recolectaron en una lista, que es el valor al que evalúa la expresión.
El filtrado es el proceso de crear una secuencia a partir de otra secuencia copiando todos los elementos excepto algunos de la secuencia original. La elección de qué elementos incluir en la nueva secuencia se puede hacer mediante una función predicado (una función que evalúa a un valor Boolean), o mediante la igualdad con un objeto específico.
remove-if es una función que toma una función predicado y una secuencia como argumentos, y devuelve una secuencia solo con aquellos elementos para los que el predicado evaluó a un valor falso.
En otras palabras, «elimina» todos los elementos de la secuencia para los que el predicado evalúa a verdadero. Sin embargo, ¡fíjate que esta función no modifica la secuencia original!
En su lugar, devuelve una nueva secuencia sin los elementos correspondientes. Si el predicado fue 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 específico de una secuencia, puedes usar remove, que toma el elemento a eliminar y una secuencia.
Se devuelven todos los valores de la secuencia que no sean iguales al elemento a eliminar.
NOTA: La igualdad se verifica con el eql predicado de igualdad genérico de forma predeterminada.
(remove 1 '(1 2 1 3 1 4)) ; => (2 3 4)
(remove #\l "hello") ; => "heo"
A Lucy, la alienígena de Lisp, le gustan los números y piensa que algunos son «magníficos».
Te pide que la ayudes a escribir funciones para hacer que los números sean más magníficos.
Lo que Lucy considera que hace magnífico a un número puede cambiar, así que las funciones tendrán que ser flexibles.
Para convertir una lista de números en una lista de números más magníficos, tendrás que escribir una función make-magnificent-maybe que reciba una función para aplicarla a los números y una lista de números.
Debe evaluar a una lista 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 quiere ver solo los números que son verdaderamente magníficos.
Sabe con certeza que el 1 nunca es magnífico, así que tendrás que quitarlo.
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 una lista de números, y devuelva solo los mejores números (no 1 y no los números para los que la función evalúe a 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.