Elisir - Loops
A causa dell'immutabilità, i loop in Elixir (come in qualsiasi linguaggio di programmazione funzionale) sono scritti in modo diverso dai linguaggi imperativi. Ad esempio, in un linguaggio imperativo come il C, scriverai:
for(i = 0; i < 10; i++) {
printf("%d", array[i]);
}
Nell'esempio riportato sopra, stiamo mutando sia l'array che la variabile i. La mutazione non è possibile in Elixir. Invece, i linguaggi funzionali si basano sulla ricorsione: una funzione viene chiamata ricorsivamente fino a quando non viene raggiunta una condizione che interrompe l'azione ricorsiva. Nessun dato viene modificato in questo processo.
Scriviamo ora un semplice ciclo usando la ricorsione che stampa ciao n volte.
defmodule Loop do
def print_multiple_times(msg, n) when n <= 1 do
IO.puts msg
end
def print_multiple_times(msg, n) do
IO.puts msg
print_multiple_times(msg, n - 1)
end
end
Loop.print_multiple_times("Hello", 10)
Quando il programma precedente viene eseguito, produce il seguente risultato:
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Abbiamo utilizzato le tecniche di pattern matching della funzione e la ricorsione per implementare con successo un ciclo. Le definizioni ricorsive sono difficili da capire ma convertire i cicli in ricorsione è facile.
Elixir ci fornisce il Enum module. Questo modulo è utilizzato per le chiamate di loop più iterative poiché è molto più facile da usare che cercare di capire definizioni ricorsive per le stesse. Ne discuteremo nel prossimo capitolo. Le tue definizioni ricorsive dovrebbero essere usate solo quando non trovi una soluzione usando quel modulo. Queste funzioni sono ottimizzate per la chiamata di coda e abbastanza veloci.