Erste Schritte mit der Programmiersprache Elixir
Veröffentlicht: 2022-03-11Wenn Sie Blogbeiträge, Hacker-News-Threads, die Tweets Ihrer Lieblingsentwickler gelesen oder Podcasts angehört haben, haben Sie an dieser Stelle wahrscheinlich schon von der Programmiersprache Elixir gehört. Die Sprache wurde von Jose Valim entwickelt, einem bekannten Entwickler in der Open-Source-Welt. Sie kennen ihn vielleicht vom MVC-Framework Ruby on Rails oder von devise und simple_form ruby gems, an denen er und seine Kollegen von der Plataformatec in den letzten Jahren gearbeitet haben.
Laut Jose Valim wurde Elixir im Jahr 2011 geboren. Er hatte die Idee, die neue Sprache zu entwickeln, da es an guten Werkzeugen mangelte, um die Nebenläufigkeitsprobleme in der Ruby-Welt zu lösen. Zu dieser Zeit, nachdem er Zeit damit verbracht hatte, Nebenläufigkeit und verteilte fokussierte Sprachen zu studieren, fand er zwei Sprachen, die ihm gefielen, Erlang und Clojure, die in der JVM laufen. Er mochte alles, was er in der Erlang-Sprache (Erlang VM) sah, und er hasste die Dinge, die er nicht sah, wie Polymorphie, Metaprogrammierung und Spracherweiterbarkeitsattribute, in denen Clojure gut war. Daher wurde Elixir mit diesem Hintergedanken geboren, um eine Alternative für Clojure und eine dynamische Sprache zu haben, die in der Erlang Virtual Machine mit guter Erweiterbarkeitsunterstützung läuft.
Elixir beschreibt sich selbst als eine dynamische, funktionale Sprache mit unveränderlichem Status und einem akteursbasierten Ansatz zur Parallelität, der zum Erstellen skalierbarer und wartbarer Anwendungen mit einer einfachen, modernen und sauberen Syntax entwickelt wurde. Die Sprache wird in der Erlang Virtual Machine ausgeführt, einer kampferprobten, hochleistungsfähigen und verteilten virtuellen Maschine, die für ihre Eigenschaften mit geringer Latenz und Fehlertoleranz bekannt ist.
Bevor wir Code sehen, sollte gesagt werden, dass Elixir von der wachsenden Community akzeptiert wurde. Wenn Sie Elixir heute lernen möchten, finden Sie leicht Bücher, Bibliotheken, Konferenzen, Meetups, Podcasts, Blog-Posts, Newsletter und alle Arten von Lernquellen, die von den Erlang-Erstellern akzeptiert wurden.
Lassen Sie uns etwas Code sehen!
Elixier installieren:
Die Installation von Elixir ist auf allen wichtigen Plattformen super einfach und in den meisten von ihnen ein Einzeiler.
Arch-Linux
Elixir ist auf Arch Linux über die offiziellen Repositories verfügbar:
pacman -S elixirUbuntu
Die Installation von Elixir in Ubuntu ist etwas umständlich. Aber es ist trotzdem einfach genug.
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 elixirOSX
Installieren Sie Elixir in OS X mit Homebrew.
brew install elixirLernen Sie IEx kennen
Nachdem die Installation abgeschlossen ist, ist es an der Zeit, Ihre Shell zu öffnen. Sie werden viel Zeit in Ihrer Shell verbringen, wenn Sie sich in Elixir weiterentwickeln möchten.
Die interaktive Shell von Elixir oder IEx ist eine REPL - (Read Evaluate Print Loop), in der Sie Elixir erkunden können. Sie können dort Ausdrücke eingeben, die ausgewertet werden und Ihnen sofort eine Rückmeldung geben. Denken Sie daran, dass Ihr Code wirklich evaluiert und nicht kompiliert wird, also stellen Sie sicher, dass Sie weder Profiling noch Benchmarks in der Shell ausführen.
Der Break-Befehl
Es gibt eine wichtige Sache, die Sie wissen müssen, bevor Sie IEx REPL starten – wie Sie es beenden.
Sie sind wahrscheinlich daran gewöhnt, CTRL+C zu drücken, um die im Terminal ausgeführten Programme zu schließen. Wenn Sie im IEx REPL CTRL+C drücken, öffnen Sie das Break-Menü. Sobald Sie sich im Unterbrechungsmenü befinden, können Sie erneut CTRL+C drücken, um die Shell zu verlassen, sowie a drücken.
Ich werde nicht in die Break-Menü-Funktionen eintauchen. Aber sehen wir uns ein paar IEx-Helfer an!
Helfer
IEx bietet eine Reihe von Helfern, um alle aufzulisten, geben Sie ein: h() .
Und das sollten Sie sehen:
Das sind einige meiner Favoriten, ich denke, sie werden auch deine sein.
-
hWie wir gerade gesehen haben, druckt diese Funktion die Hilfsmeldung. -
h/1, was dieselbe Funktion ist, aber jetzt ein Argument erwartet.
Wann immer Sie zum Beispiel die Dokumentation der Methode String strip/2 sehen möchten, können Sie das ganz einfach tun:
Der wahrscheinlich zweitnützlichste IEx-Helfer, den Sie beim Programmieren in Elixir verwenden werden, ist c/2 , der eine bestimmte Elixir-Datei (oder eine Liste) kompiliert und als zweiten Parameter einen Pfad erwartet, in den die kompilierten Dateien geschrieben werden.
Angenommen, Sie arbeiten an einer der http://exercism.io/ Elixir-Übungen, der Anagramm-Übung.
Sie haben also das Anagram -Modul implementiert, das die Methode match/2 in der Datei anagram.exs hat. Als guter Entwickler, der Sie sind, haben Sie ein paar Spezifikationen geschrieben, um sicherzustellen, dass auch alles wie erwartet funktioniert.
So sieht Ihr aktuelles Verzeichnis aus:
Um nun Ihre Tests gegen das Anagram-Modul auszuführen, müssen Sie die Tests ausführen/kompilieren.
Wie Sie gerade gesehen haben, rufen Sie zum Kompilieren einer Datei einfach die ausführbare Datei elixir auf, die als Argument den Pfad zu der Datei übergibt, die Sie kompilieren möchten.
Nehmen wir nun an, Sie möchten die IEx REPL mit dem Anagram-Modul ausführen, auf das im Sitzungskontext zugegriffen werden kann. Es gibt zwei häufig verwendete Optionen. Das erste ist, dass Sie die Datei anfordern können, indem Sie die Optionen -r verwenden, so etwas wie iex -r anagram.exs . Die zweite können Sie direkt aus der IEx-Sitzung heraus kompilieren.
Einfach, einfach so!
Ok, was ist, wenn Sie ein Modul neu kompilieren möchten? Sollten Sie den IEx beenden, erneut ausführen und die Datei erneut kompilieren? Nö! Wenn Sie ein gutes Gedächtnis haben, werden Sie sich daran erinnern, dass wir bei der Auflistung aller in IEx REPL verfügbaren Helfer etwas über einen Neukompilierungsbefehl gesehen haben. Mal sehen, wie es funktioniert.
Beachten Sie, dass Sie dieses Mal das Modul selbst und nicht den Dateipfad als Argument übergeben haben.

Wie wir gesehen haben, hat IEx eine Menge anderer nützlicher Helfer, die Ihnen helfen werden, besser zu lernen und zu verstehen, wie ein Elixir-Programm funktioniert.
Grundlagen der Elixir-Typen
Zahlen
Es gibt zwei Arten von Zahlen. Ganzzahlen und Fließkommazahlen beliebiger Größe.
Ganze Zahlen
Ganzzahlen können dezimal, hexadezimal, oktal und binär geschrieben werden.
Wie in Ruby können Sie beim Schreiben großer Zahlen Unterstriche verwenden, um Gruppen von drei Ziffern zu trennen. Zum Beispiel könnten Sie hundert Millionen so ausgleichen:
100_000_000Oktal:
0o444Hexdezimal:
0xabcBinär:
0b1011Schwimmt
Floare sind IEEE 754 mit doppelter Genauigkeit. Sie haben eine Genauigkeit von 16 Stellen und einen maximalen Exponenten von etwa 10308.
Floats werden mit einem Dezimalpunkt geschrieben. Vor und nach dem Punkt muss mindestens eine Ziffer stehen. Sie können auch einen abschließenden Exponenten anhängen. Zum Beispiel 1.0, 0.3141589e1 und 314159.0-e.
Atome
Atome sind Konstanten, die Namen darstellen. Sie sind unveränderliche Werte. Sie schreiben ein Atom mit einem führenden Doppelpunkt : und einer Folge von Buchstaben, Ziffern, Unterstrichen und At-Zeichen @ . Sie können sie auch mit einem führenden Doppelpunkt : und einer beliebigen, in Anführungszeichen eingeschlossenen Zeichenfolge schreiben.
Atome sind ein sehr mächtiges Werkzeug, sie werden verwendet, um Erlang-Funktionen sowie Schlüssel und Elixir-Methoden zu referenzieren.
Hier sind ein paar gültige Atome.
:name, :first_name, :"last name", :===, :is_it_@_question?Boolesche Werte
Natürlich sind boolesche Werte wahre und falsche Werte. Aber das Schöne an ihnen ist, dass sie letztendlich nur Atome sind.
Saiten
Standardmäßig sind Strings in Elixir UTF-8-kompatibel. Um sie zu verwenden, können Sie eine beliebige Anzahl von Zeichen in " oder ' einschließen. Sie können auch interpolierte Ausdrücke innerhalb der Zeichenfolge sowie Escape-Zeichen verwenden.
Beachten Sie, dass Zeichenfolgen in einfachen Anführungszeichen eigentlich eine Liste von Binärdateien sind.
Anonyme Funktionen
Als funktionale Sprache hat Elixir als Grundtyp anonyme Funktionen. Eine einfache Möglichkeit, eine Funktion zu schreiben, ist fn (argument_list) -> body end . Eine Funktion kann jedoch mehrere Körper mit mehreren Argumentlisten, Schutzklauseln usw. haben.
Dave Thomas schlägt im Buch Programming Elixir vor, dass wir uns fn…end als die Anführungszeichen vorstellen, die ein String-Literal umgeben, wobei wir statt eines String-Werts eine Funktion zurückgeben.
Tupel
Tuple ist ein unveränderliches indiziertes Array. Sie kehren schnell zu ihrer Größe zurück und fügen aufgrund ihrer unveränderlichen Natur nur langsam neue Werte hinzu. Wenn Sie ein Tupel aktualisieren, erstellen Sie tatsächlich eine ganz neue Kopie des Tupels selbst.
Tupel werden sehr oft als Rückgabewert eines Arrays verwendet. Beim Programmieren in Elixir wirst du sehr oft dies sehen, {:ok, something_else_here} .
So schreiben wir ein Tupel: {?a,?b,?c} .
Musterabgleich
Ich kann Ihnen nicht alles erklären, was Sie über den Musterabgleich wissen müssen, aber was Sie gleich lesen werden, deckt vieles ab, was Sie wissen müssen, um loszulegen.
Elixir verwendet = als Übereinstimmungsoperator. Um dies zu verstehen, müssen wir gewissermaßen verlernen, was wir über = in anderen traditionellen Sprachen wissen. In traditionellen Sprachen steht der Gleichheitsoperator für Zuweisungen. In Elixir dienen die Gleichheitsoperatoren dem Mustervergleich.
So funktioniert es also mit den Werten auf der linken Seite. Wenn es sich um Variablen handelt, werden sie an die rechte Seite gebunden, wenn sie keine Variablen sind, versucht Elixir, sie mit der rechten Seite abzugleichen.
Pin-Operator
Elixir bietet eine Möglichkeit, den Musterabgleich immer gegen die Variable auf der linken Seite, den Pin-Operator, zu erzwingen.
Listen
In Elixir sehen Listen wie Arrays aus, wie wir es aus anderen Sprachen kennen, sind es aber nicht. Listen sind verkettete Strukturen, die aus einem Kopf und einem Schwanz bestehen.
Stichwortlisten
Schlüsselwortlisten sind eine Liste von Tupelpaaren.
Sie schreiben sie einfach als Listen. Zum Beispiel: [{:eins, 1}, 2, {:drei, 3}]. Es gibt eine Abkürzung zum Definieren von Listen, so sieht es aus: [eins: 1, drei: 3].
Um ein Element aus einer Schlüsselwortliste abzurufen, können Sie entweder verwenden:
Keyword.get([{:one, 1}, 2, {:three, 3}], :one)Oder verwenden Sie die Tastenkombination:
[{:one, 1}, 2, {:three, 3}][:one]Da Schlüsselwortlisten beim Abrufen eines Werts langsam sind, ist dies ein teurer Vorgang. Wenn Sie also Daten speichern, auf die ein schneller Zugriff erforderlich ist, sollten Sie eine Karte verwenden.
Karten
Karten sind eine effiziente Sammlung von Schlüssel/Wert-Paaren. Der Schlüssel kann einen beliebigen Wert als Schlüssel haben, sollte aber normalerweise vom gleichen Typ sein. Im Gegensatz zu Schlüsselwortlisten erlauben Karten nur einen Eintrag für einen bestimmten Schlüssel. Sie sind effizient, wenn sie wachsen, und sie können im Elixir-Musterabgleich in Karten für allgemeine Verwendung verwendet werden, wenn Sie ein assoziatives Array benötigen.
So können Sie eine Karte schreiben:
%{ :one => 1, :two => 2, 3 => 3, "four" => 4, [] => %{}, {} => [k: :v]}Fazit
Elixir ist großartig, leicht zu verstehen, hat einfache, aber leistungsstarke Typen und sehr nützliche Werkzeuge, die Ihnen helfen werden, wenn Sie mit dem Lernen beginnen. In diesem ersten Teil haben wir die verschiedenen Datentypen behandelt, auf denen Elixir-Programme aufbauen, und die Operatoren, die sie antreiben. In späteren Teilen werden wir tiefer in die Welt von Elixir eintauchen – funktionale und nebenläufige Programmierung.
