La riduzione consiste nell'applicare ripetutamente una funzione a ogni elemento di una sequenza e nell'accumulare in qualche modo i risultati. La funzione applicata prende due parametri: il valore accumulato corrente e l'elemento da elaborare. Il suo risultato deve essere il nuovo valore accumulato.
In Common Lisp il procedimento si esegue con la funzione reduce.
Nella sua forma più semplice si presenta così:
(reduce #'function-to-apply sequence :initial-value value)
Nota che viene fornito un valore iniziale: sarà il «valore accumulato corrente» passato alla funzione quando viene elaborato il primo elemento.
Ecco un esempio che somma i numeri della lista partendo da un valore iniziale di 10:
(reduce #'+ '(1 2 3 4) :initial-value 10) ; => 20
Nota che, se la sequenza è vuota, la funzione non viene mai chiamata e la forma si valuta nel valore iniziale.
Logan, l'alieno Lisp, ama i numeri e anche organizzare.
Ti chiedono di aiutarli a scrivere una funzione che prende una lista di numeri e produce una coppia di due liste: la prima contiene tutti i numeri dispari, la seconda tutti i numeri pari.
Per prima cosa dovrai creare una funzione che prende una coppia di due liste e un numero e inserisce quel numero nella sottolista corretta, a seconda che sia dispari o pari:
(categorize-number '((1) . (2)) 23) ; => ((23 1) . (2))
(categorize-number '((1) . (2)) 42) ; => ((1) . (42 2))
Ora, usando la funzione che hai appena creato, puoi scrivere un'altra funzione che prende una lista di numeri e li categorizza come hai fatto qui sopra:
(partition-numbers '(1 2 3 4)) ; => ((3 1) . (4 2))
(partition-numbers '(42 31 24 13)) ; => ((13 31) . (24 42))
Iscriviti a Exercism per imparare e padroneggiare Common Lisp con 27 concetti92 esercizi e il mentoring di persone reali, tutto gratis.