Premiers pas avec le langage de programmation Elixir

Publié: 2022-03-11

Si vous avez lu des articles de blog, des fils d'actualités sur les hackers, les tweets de vos développeurs préférés ou écouté des podcasts, vous avez probablement déjà entendu parler du langage de programmation Elixir. Le langage a été créé par Jose Valim, un développeur bien connu dans le monde open-source. Vous le connaissez peut-être grâce au framework Ruby on Rails MVC ou à ses gemmes ruby ​​devis et simple_form sur lesquelles lui et ses collègues de Plataformatec ont travaillé ces dernières années.

Selon Jose Valim, Elixir est né en 2011. Il a eu l'idée de construire le nouveau langage en raison du manque de bons outils pour résoudre les problèmes de concurrence dans le monde ruby. À cette époque, après avoir passé du temps à étudier la concurrence et les langages focalisés distribués, il a trouvé deux langages qu'il aimait, Erlang et Clojure qui s'exécutent dans la JVM. Il aimait tout ce qu'il voyait dans le langage Erlang (Erlang VM) et il détestait les choses qu'il ne voyait pas, comme le polymorphisme, la métaprogrammation et les attributs d'extensibilité du langage pour lesquels Clojure était doué. Ainsi, Elixir est né dans cet esprit, pour avoir une alternative à Clojure et un langage dynamique qui s'exécute dans la machine virtuelle Erlang avec un bon support d'extensibilité.

Elixir se décrit comme un langage fonctionnel dynamique avec un état immuable et une approche de la concurrence basée sur les acteurs, conçue pour créer des applications évolutives et maintenables avec une syntaxe simple, moderne et ordonnée. Le langage s'exécute dans la machine virtuelle Erlang, une machine virtuelle à l'épreuve des batailles, hautes performances et distribuée connue pour ses caractéristiques de faible latence et de tolérance aux pannes.

Avant de voir du code, il convient de dire qu'Elixir a été accepté par la communauté qui grandit. Si vous voulez apprendre Elixir aujourd'hui, vous trouverez facilement des livres, des bibliothèques, des conférences, des rencontres, des podcasts, des articles de blog, des newsletters et toutes sortes de sources d'apprentissage, ainsi que cela a été accepté par les créateurs d'Erlang.

Voyons un peu de code !

Installez Elixir :

L'installation d'Elixir est super facile sur toutes les principales plates-formes et est une ligne dans la plupart d'entre elles.

Arch Linux

Elixir est disponible sur Arch Linux via les dépôts officiels :

 pacman -S elixir

Ubuntu

L'installation d'Elixir dans Ubuntu est un peu fastidieuse. Mais c'est quand même assez facile.

 wget https://packages.erlang-solutions.com/erlang-solutions_1.0_all.deb && sudo dpkg -i erlang-solutions_1.0_all.deb apt-get update apt-get install esl-erlang apt-get install elixir

OS X

Installez Elixir sous OS X en utilisant Homebrew.

 brew install elixir

Rencontrez IEx

Une fois l'installation terminée, il est temps d'ouvrir votre shell. Vous passerez beaucoup de temps dans votre coquille si vous souhaitez évoluer en Elixir.

Le shell interactif d'Elixir ou IEx est un REPL - (Read Evaluate Print Loop) où vous pouvez explorer Elixir. Vous pouvez y saisir des expressions et elles seront évaluées en vous donnant un retour immédiat. Gardez à l'esprit que votre code est vraiment évalué et non compilé, alors assurez-vous de ne pas exécuter de profilage ni de benchmarks dans le shell.

Une démo IEx REPL.

La commande d'arrêt

Il y a une chose importante que vous devez savoir avant de démarrer le REPL IEx - comment le quitter.

Vous avez probablement l'habitude d'appuyer sur CTRL+C pour fermer les programmes en cours d'exécution dans le terminal. Si vous appuyez sur CTRL+C dans le REPL IEx, vous ouvrirez le menu Break. Une fois dans le menu de pause, vous pouvez à nouveau appuyer sur CTRL+C pour quitter le shell et appuyer sur a .

Sortie de l'IEx REPL.

Je ne vais pas plonger dans les fonctions du menu de pause. Mais voyons quelques assistants IEx !

Aides

IEx fournit un tas d'assistants, afin de tous les lister, tapez : h() .

Et voici ce que vous devriez voir :

Aides IEx.

Ce sont quelques-uns de mes favoris, je pense qu'ils seront aussi les vôtres.

  • h comme nous venons de le voir, cette fonction imprimera le message d'aide.
  • h/1 qui est la même fonction, mais maintenant elle attend un argument.

Par exemple, chaque fois que vous souhaitez consulter la documentation de la méthode String strip/2 , vous pouvez facilement faire :

IEx : Vérification de la documentation.

Le deuxième assistant IEx le plus utile que vous allez utiliser lors de la programmation dans Elixir est probablement le c/2 , qui compile un fichier elixir donné (ou une liste) et attend comme deuxième paramètre un chemin pour écrire les fichiers compilés.

Disons que vous travaillez dans l'un des http://exercism.io/ exercices Elixir, l'exercice Anagram.

Vous avez donc implémenté le module Anagram , qui a la méthode match/2 dans le fichier anagram.exs. En tant que bon développeur que vous êtes, vous avez rédigé quelques spécifications pour vous assurer que tout fonctionne également comme prévu.

Voici à quoi ressemble votre répertoire actuel :

Liste de répertoire pour ce projet Elixir.

Maintenant, pour exécuter vos tests sur le module Anagram, vous devez exécuter/compiler les tests.

Exécution des tests dans Elixir.

Comme vous venez de le voir, pour compiler un fichier, il suffit d'invoquer l'exécutable elixir en passant en argument le chemin vers le fichier que vous souhaitez compiler.

Supposons maintenant que vous souhaitiez exécuter le REPL IEx avec le module Anagramme accessible dans le contexte de la session. Il existe deux options couramment utilisées. La première est que vous pouvez exiger le fichier en utilisant les options -r , quelque chose comme iex -r anagram.exs . Le second, vous pouvez le compiler directement depuis la session IEx.

Compiler directement à partir d'une session IEx.

Simple, comme ça !

Ok, et si vous voulez recompiler un module ? Devez-vous quitter l'IEx, l'exécuter à nouveau et compiler à nouveau le fichier ? Nan! Si vous avez une bonne mémoire, vous vous souviendrez que lorsque nous avons répertorié tous les assistants disponibles dans le REPL IEx, nous avons vu quelque chose à propos d'une commande de recompilation. Voyons voir comment ça fonctionne.

Recompilation sous IEx.

Notez que cette fois, vous avez passé en argument le module lui-même et non le chemin du fichier.

Comme nous l'avons vu, IEx propose de nombreux autres assistants utiles qui vous aideront à apprendre et à mieux comprendre le fonctionnement d'un programme Elixir.

Principes de base des types d'élixir

Nombres

Il existe deux types de nombres. Nombres entiers et nombres à virgule flottante de taille arbitraire.

Entiers

Les entiers peuvent être écrits en base décimale, hexadécimale, octale et binaire.

Comme dans Ruby, vous pouvez utiliser le trait de soulignement pour séparer des groupes de trois chiffres lors de l'écriture de grands nombres. Par exemple, vous pourriez récupérer cent millions comme ceci :

 100_000_000

Octale :

 0o444

Hexdécimal :

 0xabc

Binaire:

 0b1011

Flotteurs

Floare est une double précision IEEE 754. Ils ont 16 chiffres de précision et un exposant maximum d'environ 10308.

Les flottants sont écrits avec un point décimal. Il doit y avoir au moins un chiffre avant et après le point. Vous pouvez également ajouter un exposant final. Par exemple 1.0, 0.3141589e1 et 314159.0-e.

Atomes

Les atomes sont des constantes qui représentent des noms. Ce sont des valeurs immuables. Vous écrivez un atome avec deux-points : et une séquence de lettres, de chiffres, de traits de soulignement et de signes @ . Vous pouvez également les écrire avec deux-points : et une séquence arbitraire de caractères entre guillemets.

Les atomes sont un outil très puissant, ils sont utilisés pour référencer les fonctions erlang ainsi que les clés et les méthodes Elixir.

Voici quelques atomes valides.

 :name, :first_name, :"last name", :===, :is_it_@_question?

Booléens

Bien sûr, les booléens sont des valeurs vraies et fausses. Mais ce qu'il y a de bien avec eux, c'est qu'en fin de compte, ce ne sont que des atomes.

Les booléens ne sont que des atomes, comme le prouve l'IEx.

Cordes

Par défaut, les chaînes dans Elixir sont conformes à UTF-8. Pour les utiliser, vous pouvez avoir un nombre arbitraire de caractères entourés de " ou ' . Vous pouvez également avoir des expressions interpolées à l'intérieur de la chaîne ainsi que des caractères échappés.

Interpolation de chaîne d'élixir.

Sachez que les chaînes entre guillemets simples sont en fait une liste de binaires.

Comportement des chaînes entre guillemets simples dans Elixir.

Fonctions anonymes

En tant que langage fonctionnel, Elixir a des fonctions anonymes comme type de base. Une façon simple d'écrire une fonction est fn (argument_list) -> body end . Mais une fonction peut avoir plusieurs corps avec plusieurs listes d'arguments, clauses de garde, etc.

Dave Thomas, dans le livre Programming Elixir, suggère que nous pensions à fn…end comme étant les guillemets qui entourent un littéral de chaîne, où au lieu de renvoyer une valeur de chaîne, nous renvoyons une fonction.

Renvoyer une fonction Elixir.

Tuples

Tuple est un tableau indexé immuable. Ils sont rapides à retourner sa taille et lents à ajouter de nouvelles valeurs en raison de sa nature immuable. Lors de la mise à jour d'un tuple, vous créez en fait une toute nouvelle copie du tuple self.

Les tuples sont très souvent utilisés comme valeur de retour d'un tableau. Lors du codage dans Elixir, vous verrez très souvent ceci, {:ok, something_else_here} .

Voici comment nous écrivons un tuple : {?a,?b,?c} .

Correspondance de modèle

Je ne serai pas en mesure d'expliquer tout ce que vous devez savoir sur le Pattern Matching, mais ce que vous êtes sur le point de lire couvre une grande partie de ce que vous devez savoir pour commencer.

Elixir utilise = comme opérateur de correspondance. Pour comprendre cela, nous avons en quelque sorte besoin de désapprendre ce que nous savons sur = dans d'autres langues traditionnelles. Dans les langages traditionnels, l'opérateur égal est pour l'affectation. Dans Elixir, les opérateurs d'égalité sont destinés à la correspondance de modèles.

C'est ainsi que les valeurs du côté gauche fonctionnent. S'il s'agit de variables, elles sont liées au côté droit, si ce ne sont pas des variables, Elixir essaie de les faire correspondre au côté droit.

Démo de correspondance de motifs Elixir.

Opérateur de broche

Elixir fournit un moyen de toujours forcer la correspondance de modèle par rapport à la variable du côté gauche, l'opérateur pin.

Démonstration de l'opérateur de broche Elixir.

Listes

Dans Elixir, les listes ressemblent à des tableaux tels que nous les connaissons dans d'autres langages, mais ce n'est pas le cas. Les listes sont des structures liées composées d'une tête et d'une queue.

Comportement de la liste d'élixirs.

Listes de mots clés

Les listes de mots-clés sont une liste de paires de tuples.

Vous les écrivez simplement sous forme de listes. Par exemple : [{:un, 1}, 2, {:trois, 3}]. Il existe un raccourci pour définir des listes, voici à quoi il ressemble : [un : 1, trois : 3].

Pour récupérer un élément d'une liste de mots clés, vous pouvez soit utiliser :

 Keyword.get([{:one, 1}, 2, {:three, 3}], :one)

Ou utilisez le raccourci :

 [{:one, 1}, 2, {:three, 3}][:one]

Étant donné que les listes de mots-clés sont lentes lors de la récupération d'une valeur, il s'agit d'une opération coûteuse. Par conséquent, si vous stockez des données nécessitant un accès rapide, vous devez utiliser une carte.

Plans

Les cartes sont une collection efficace de paires clé/valeur. La clé peut avoir n'importe quelle valeur en tant que clé, mais elle doit généralement être du même type. Contrairement aux listes de mots-clés, Maps n'autorise qu'une seule entrée pour une clé donnée. Ils sont efficaces à mesure qu'ils grandissent et ils peuvent être utilisés dans la correspondance de motifs Elixir dans les cartes à usage général lorsque vous avez besoin d'un tableau associatif.

Voici comment vous pouvez écrire une carte :

 %{ :one => 1, :two => 2, 3 => 3, "four" => 4, [] => %{}, {} => [k: :v]}

Conclusion

Elixir est génial, facile à comprendre, a des types simples mais puissants et des outils très utiles qui vous aideront à commencer à apprendre. Dans cette première partie, nous avons couvert les différents types de données sur lesquels les programmes Elixir sont construits et les opérateurs qui les alimentent. Dans les parties suivantes, nous plongerons plus profondément dans le monde d'Elixir - la programmation fonctionnelle et concurrente.

Connexes : Déterrer ClojureScript pour le développement frontal