Elixir - Bucles

Debido a la inmutabilidad, los bucles en Elixir (como en cualquier lenguaje de programación funcional) se escriben de manera diferente a los lenguajes imperativos. Por ejemplo, en un lenguaje imperativo como C, escribirás:

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

En el ejemplo anterior, estamos mutando tanto la matriz como la variable i. La mutación no es posible en Elixir. En cambio, los lenguajes funcionales se basan en la recursividad: una función se llama de forma recursiva hasta que se alcanza una condición que impide que la acción recursiva continúe. No se modifican datos en este proceso.

Escribamos ahora un ciclo simple usando recursividad que imprima hola n veces.

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)

Cuando se ejecuta el programa anterior, produce el siguiente resultado:

Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello

Hemos utilizado las técnicas de coincidencia de patrones de funciones y la recursividad para implementar con éxito un bucle. Las definiciones recursivas son difíciles de entender, pero convertir bucles en recursividad es fácil.

Elixir nos proporciona el Enum module. Este módulo se usa para las llamadas en bucle más iterativas, ya que es mucho más fácil usarlas que tratar de encontrar definiciones recursivas para las mismas. Los discutiremos en el próximo capítulo. Sus propias definiciones recursivas solo deben usarse cuando no encuentre una solución usando ese módulo. Esas funciones están optimizadas para llamadas de cola y bastante rápidas.