La reducción consiste en aplicar repetidamente una función a cada elemento de una secuencia e ir acumulando, de alguna manera, los resultados. La función que se aplica toma dos parámetros: el valor acumulado actual y el elemento que hay que procesar. Debe evaluarse al nuevo valor acumulado.
En Common Lisp, este proceso se lleva a cabo con la función reduce.
En su forma más simple, se ve así:
(reduce #'function-to-apply sequence :initial-value value)
Fíjate en 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í tienes un ejemplo que suma los números de la lista, empezando con un valor inicial de 10:
(reduce #'+ '(1 2 3 4) :initial-value 10) ; => 20
Ten en cuenta que, si la secuencia está vacía, la función nunca se llama y la forma se evalúa al valor inicial.
A Logan, el alienígena de Lisp, le gustan los números y también le gusta organizar.
Te piden que les ayudes a escribir una función que reciba una lista de números y produzca un par de dos listas: la primera son todos los números impares y la segunda, todos los pares.
Primero tendrás que crear una función que reciba un par de dos listas y un número, y coloque ese número en la sublista correcta 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 una lista de números y los categorice como hiciste antes:
(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.