Elixir - Boucles

En raison de l'immuabilité, les boucles dans Elixir (comme dans tout langage de programmation fonctionnel) sont écrites différemment des langages impératifs. Par exemple, dans un langage impératif comme C, vous écrirez -

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

Dans l'exemple donné ci-dessus, nous mutons à la fois le tableau et la variable i. La mutation n'est pas possible dans Elixir. Au lieu de cela, les langages fonctionnels reposent sur la récursivité: une fonction est appelée de manière récursive jusqu'à ce qu'une condition soit atteinte qui empêche l'action récursive de se poursuivre. Aucune donnée n'est mutée dans ce processus.

Écrivons maintenant une boucle simple en utilisant la récursivité qui affiche bonjour n fois.

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)

Lorsque le programme ci-dessus est exécuté, il produit le résultat suivant -

Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello

Nous avons utilisé les techniques de correspondance de modèles de fonction et la récursivité pour implémenter avec succès une boucle. Les définitions récursives sont difficiles à comprendre mais la conversion de boucles en récursivité est facile.

Elixir nous fournit le Enum module. Ce module est utilisé pour les appels en boucle les plus itératifs car il est beaucoup plus facile de les utiliser que d'essayer de trouver des définitions récursives pour les mêmes. Nous en discuterons dans le prochain chapitre. Vos propres définitions récursives ne doivent être utilisées que lorsque vous ne trouvez pas de solution utilisant ce module. Ces fonctions sont optimisées pour les appels de queue et assez rapides.