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.