La reducción es la aplicación repetida de una función a cada elemento de una secuencia, acumulando de alguna manera los resultados. La función que se aplica toma dos parámetros: el valor acumulado actual y el elemento a procesar. Debe dar como resultado el nuevo valor acumulado.
En Common Lisp, el proceso se hace con la función reduce.
En su forma más simple, se ve así:
(reduce #'function-to-apply sequence :initial-value value)
Fíjate que se proporciona un valor inicial: este será el «valor acumulado actual» que se pasa a la función cuando se procesa el primer elemento.
Aquí hay un ejemplo que suma entre sí los números del array, empezando con un valor inicial de 10:
(reduce #'+ '(1 2 3 4) :initial-value 10) ; => 20
Nota que si la secuencia está vacía, la función nunca se llama y la forma evalúa al valor inicial.
Logan, el alienígena de Lisp, ama los números y también le gusta organizar.
Te pide que le ayudes a escribir una función que reciba un array de números y produzca un par de dos arrays: el primero contiene todos los números impares y el segundo, todos los números pares.
Primero vas a necesitar crear una función que reciba un par de dos arrays y un número, y que coloque ese número en el array correcto según si es impar o par:
(categorize-number '((1) . (2)) 23) ; => ((23 1) . (2))
(categorize-number '((1) . (2)) 42) ; => ((1) . (42 2))
Ahora, usando la función que acabas de crear, puedes escribir otra función que reciba un array de números y los categorice como lo hiciste arriba:
(partition-numbers '(1 2 3 4)) ; => ((3 1) . (4 2))
(partition-numbers '(42 31 24 13)) ; => ((13 31) . (24 42))
Regístrate en Exercism para aprender y dominar Common Lisp con 27 conceptos92 ejercicios y mentoría humana real, todo gratis.