Curso de Raku / Apéndice 🆕 / Flujo y funciones / Subrutinas y estilo funcional / Exercises / Un acumulador continuo
Solución: Un acumulador continuo
Aquí tienes una posible solución para la tarea.
Código
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);🦋 Puedes encontrar el código fuente en el archivo accumulator.raku.
Salida
110
135
130Comentarios
El bloque devuelto se cierra sobre
$total: esa variable sigue viva entre llamadas, así que cada llamada recuerda el total de la anterior.$total += $amountactualiza a la vez la suma acumulada y la devuelve, que es lo que imprime cadasay:110, después135, después130.Una alternativa guarda el total dentro del propio bloque, en una variable
state. A diferencia de unmycorriente, una variablestatese inicializa una sola vez —la primera vez que se ejecuta el bloque— y conserva después su valor entre llamadas posteriores: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);
Cada llamada a
make-accumulatorproduce un bloque nuevo con su propiostate $total, así que los acumuladores distintos siguen siendo independientes, y la clausura sobre$startsigue dando a cada uno su propio valor inicial.