Corso di Raku / Appendice 🆕 / Flusso e funzioni / Subroutine e stile funzionale / Exercises / Un accumulatore progressivo
Soluzione: Un accumulatore progressivo
Ecco una possibile soluzione del compito.
Codice
sub make-accumulator($start) {
my $total = $start;
return -> $amount { $total += $amount };
}
my $acc = make-accumulator(100);
say $acc(10);
say $acc(25);
say $acc(-5);🦋 Trova il programma nel file accumulator.raku.
Output
110
135
130Commenti
Il blocco restituito si chiude su
$total: quella variabile sopravvive fra una chiamata e l’altra, quindi ogni chiamata ricorda il totale della precedente.$total += $amountaggiorna la somma corrente e la restituisce insieme, ed è ciò che ognisaystampa:110, poi135, poi130.Un’alternativa tiene il totale dentro il blocco stesso, in una variabile
state. A differenza di unmyordinario, una variabilestateviene inizializzata una volta sola — al primo giro del blocco — e poi conserva il proprio valore attraverso le chiamate successive:sub make-accumulator($start) { return -> $amount { state $total = $start; $total += $amount }; } my $acc = make-accumulator(100); say $acc(10); say $acc(25); say $acc(-5);
Ogni chiamata a
make-accumulatorproduce un blocco fresco con il propriostate $total, quindi accumulatori separati restano indipendenti — e la chiusura su$startfornisce comunque a ciascuno il proprio valore di partenza.