Reduzir é aplicar uma função repetidamente a cada elemento de uma sequência e acumular, de alguma forma, os resultados. A função aplicada recebe dois parâmetros: o valor acumulado atual e o item a processar. Ela deve resultar no novo valor acumulado.
Em Common Lisp, o processo é feito com a função reduce.
Na sua forma mais simples, ela se parece com:
(reduce #'function-to-apply sequence :initial-value value)
Repare que um valor inicial é fornecido: ele será o "valor acumulado atual" passado para a função quando o primeiro elemento for processado.
Veja 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
Note que, se a sequência estiver vazia, a função nunca é chamada e a expressão resulta no valor inicial.
Logan, o alienígena do Lisp, gosta de números e também de organizar as coisas.
Eles pedem que você ajude a escrever uma função que recebe uma lista de números e produz um par de duas listas: a primeira contém todos os números ímpares e a segunda, todos os números pares.
Primeiro, você vai precisar criar uma função que recebe um par de duas listas e um número, e coloca esse número na sublista correta, dependendo de o número ser ímpar ou par:
(categorize-number '((1) . (2)) 23) ; => ((23 1) . (2))
(categorize-number '((1) . (2)) 42) ; => ((1) . (42 2))
Agora, usando a função que você acabou de criar, você pode escrever outra função que recebe uma lista de números e os categoriza como você fez acima:
(partition-numbers '(1 2 3 4)) ; => ((3 1) . (4 2))
(partition-numbers '(42 31 24 13)) ; => ((13 31) . (24 42))
Crie sua conta no Exercism para aprender e dominar Common Lisp com 27 conceitos92 exercícios e mentoria humana de verdade, tudo de graça.