Elixir - Loops

Devido à imutabilidade, os loops no Elixir (como em qualquer linguagem de programação funcional) são escritos de forma diferente das linguagens imperativas. Por exemplo, em uma linguagem imperativa como C, você escreverá -

for(i = 0; i < 10; i++) {
   printf("%d", array[i]);
}

No exemplo dado acima, estamos alterando a matriz e a variável i. A mutação não é possível no Elixir. Em vez disso, as linguagens funcionais dependem da recursão: uma função é chamada recursivamente até que uma condição seja alcançada que impeça a ação recursiva de continuar. Nenhum dado é alterado neste processo.

Vamos agora escrever um loop simples usando recursão que imprime olá n vezes.

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 o programa acima é executado, ele produz o seguinte resultado -

Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello

Utilizamos técnicas de correspondência de padrões de função e recursão para implementar um loop com sucesso. As definições recursivas são difíceis de entender, mas converter loops em recursão é fácil.

Elixir nos fornece o Enum module. Este módulo é usado para as chamadas de loop mais iterativas, pois é muito mais fácil usá-las do que tentar descobrir definições recursivas para as mesmas. Discutiremos isso no próximo capítulo. Suas próprias definições recursivas devem ser usadas apenas quando você não encontrar uma solução usando esse módulo. Essas funções são otimizadas para chamada final e bastante rápidas.