A redução é a aplicação repetida de uma função a cada elemento de uma sequência, acumulando, de alguma forma, os resultados. A função aplicada recebe dois parâmetros: o valor acumulado atual e o elemento a processar. O resultado tem de ser o novo valor acumulado.
Em Common Lisp, o processo faz-se com a função reduce.
Na sua forma mais simples, é assim:
(reduce #'function-to-apply sequence :initial-value value)
Repara que é fornecido um valor inicial. É esse o "valor acumulado atual" que é passado à função quando o primeiro elemento é processado.
Eis um exemplo que soma os números da lista, começando com um valor inicial de 10:
(reduce #'+ '(1 2 3 4) :initial-value 10) ; => 20
Repara que, se a sequência estiver vazia, a função nunca é chamada e a forma avalia para o valor inicial.
O Logan, o extraterrestre do Lisp, gosta de números e também de organizar coisas.
Pedem-te que os ajudes a escrever uma função que recebe uma lista de números e produz um par de duas listas: a primeira com todos os números ímpares, a segunda com todos os números pares.
Primeiro, tens de criar uma função que recebe um par de duas listas e um número, e coloca esse número na sublista correta, consoante seja ímpar ou par:
(categorize-number '((1) . (2)) 23) ; => ((23 1) . (2))
(categorize-number '((1) . (2)) 42) ; => ((1) . (42 2))
Agora, com a função que acabaste de criar, podes escrever outra função que recebe uma lista de números e os categoriza como fizeste acima:
(partition-numbers '(1 2 3 4)) ; => ((3 1) . (4 2))
(partition-numbers '(42 31 24 13)) ; => ((13 31) . (24 42))
Inscreve-te no Exercism para aprenderes e dominares Common Lisp com 27 conceitos92 exercícios, e mentoria humana real, tudo grátis.