Erlang Language Tutorial
Erste Schritte mit Erlang Language
Suche…
Bemerkungen
"Erlang ist eine Programmiersprache, die ursprünglich im Ericsson Computer Science Laboratory entwickelt wurde. OTP (Open Telecom Platform) ist eine Sammlung von Middleware und Bibliotheken in Erlang. Erlang / OTP wurde in einer Reihe von Ericsson-Produkten für den Aufbau robuster fehlertoleranter Produkte getestet verteilte Anwendungen, z. B. AXD301 (ATM-Switch). Erlang / OTP wird derzeit von der Erlang / OTP-Einheit bei Ericsson verwaltet. "( erlang.org )
Fang hier an
Installationsanweisungen finden Sie unter Installationsthema .
Links
- Offizielle Erlang-Site: https://www.erlang.org
- Beliebte Paketverwaltung für Erlang und Elixir: http://hex.pm
- Erlang Patterns: http://www.erlangpatterns.org/
Versionen
Hallo Welt
Es gibt zwei Dinge, die Sie beim Schreiben einer Anwendung "Hallo Welt" in Erlang wissen müssen:
- Der Quellcode wird in der Programmiersprache erlang mit einem Texteditor Ihrer Wahl geschrieben
- Die Anwendung wird dann in der virtuellen Maschine erlang ausgeführt. In diesem Beispiel interagieren wir mit der erlang-VM über die erlang-Shell.
Zuerst den Quellcode der Anwendung:
Erstellen Sie eine neue Datei hello.erl
, die Folgendes enthält:
-module(hello).
-export([hello_world/0]).
hello_world() ->
io:format("Hello, World!~n", []).
Schauen wir uns kurz an, was das bedeutet:
-
-module(hello).
Alle erlang-Funktionen sind in einem Modul vorhanden . Module werden dann zum Erstellen von Anwendungen verwendet, bei denen es sich um eine Sammlung von Modulen handelt. Diese erste Zeile dient der Identifizierung dieses Moduls, nämlich Hallo . Module können mit Java- Paketen verglichen werden -
-export([hello_world/0]).
Gibt dem Compiler an, welche Funktionen "öffentlich" sind (im Vergleich zu OO-Sprachen) und wie wichtig die betreffende Funktion ist. Die Zahl ist die Anzahl der Argumente, die die Funktion akzeptiert. In erlang wird eine Funktion mit 1 Argument als eine andere Funktion betrachtet als eine mit 2 Argumenten, obwohl der Name möglicherweise genau derselbe ist.hello_world/0
ist also eine völlig andere Funktion als zum Beispielhello_world/1
. -
hello_world()
Dies ist der Name der Funktion. Das->
zeigt den Übergang zur Implementierung (Body) der Funktion an. Dies kann gelesen werden als "hello_world () ist definiert als ...". Beachten Sie, dasshello_world()
(keine Argumente) in der VM mithello_world/0
undhello_world(Some_Arg)
alshello_world/1
. -
io:format("Hello, World!~n", [])
Vom Modulio
wird die Funktionformat/2
aufgerufen, die Funktion für die Standardausgabe.~n
ist ein Formatbezeichner, dh eine neue Zeile drucken.[]
Ist eine Liste von zu druckenden Variablen, die durch Formatbezeichner in der Ausgabezeichenfolge angegeben werden. In diesem Fall handelt es sich um nichts. - Alle erlang-Anweisungen müssen mit einem
.
(Punkt).
In Erlang wird das Ergebnis der letzten Anweisung in einer Funktion zurückgegeben.
Lassen Sie uns jetzt unsere Anwendung ausführen:
Starten Sie die erlang-Shell aus demselben Verzeichnis wie die Datei " hello.erl
":
$ erl
Sie sollten eine Eingabeaufforderung erhalten, die ungefähr so aussieht (Ihre Version kann anders sein):
Eshell V8.0 (abort with ^G)
1>
Geben Sie nun die folgenden Befehle ein:
1> c(hello).
{ok,hello}
2> hello:hello_world().
Hello, World!
ok
Gehen wir jede Zeile einzeln durch:
-
c(hello)
- dieser Befehl ruft die Funktionc
an einem Atomhello
. Dadurch wird Erlanghello.erl
, die Dateihello.erl
zu finden, in ein Modul zu kompilieren (eine Datei mit dem Namenhello.beam
wird im Verzeichnis generiert) und in die Umgebung zu laden. -
{ok, hello}
- dies ist das Ergebnis des Aufrufs der obigen Funktionc
. Es ist ein Tupel ein Atom enthält ,ok
und ein Atomhello
. Erlang-Funktionen geben normalerweise entweder{ok, Something}
oder{error, Reason}
. -
hello:hello_world()
- das ruft eine Funktionhello_world()
aus dem Modulhello
. -
Hello, World!
- das ist, was unsere Funktion druckt. -
ok
- das ist, was unsere Funktion zurückgegeben hat. Da Erlang eine funktionale Programmiersprache ist, gibt jede Funktion etwas zurück . In unserem Fall, obwohl wir nichts zurück habenhello_world()
, war der letzte Aufruf in dieser Funktionio:format(...)
und diese Funktion zurückok
, was wiederum ist es, was unsere Funktion zurückgegeben.
Module
Ein Erlang-Modul ist eine Datei mit mehreren gruppierten Funktionen. Diese Datei hat .erl
Erweiterung .erl
.
Ein "Hello World" -Modul mit dem Namen hello.erl
ist unten gezeigt
-module(hello).
-export([hello_world/0]).
hello_world() ->
io:format("Hello, World!~n", []).
In der Datei muss der Modulname angegeben werden. Wie zuvor in Zeile 1 gezeigt. Der .erl
und der Dateiname vor der Erweiterung .erl
müssen identisch sein.
Funktion
Funktion ist ein Satz von Anweisungen, die in Gruppen zusammengefasst sind. Diese gruppierten Anweisungen führen zusammen bestimmte Aufgaben aus. In erlang geben alle Funktionen beim Aufruf einen Wert zurück.
Unten sehen Sie ein Beispiel für eine Funktion, die zwei Zahlen hinzufügt
add(X, Y)-> X + Y.
Diese Funktion führt eine Add-Operation mit X- und Y-Werten aus und gibt das Ergebnis zurück. Funktion kann wie folgt verwendet werden
add(2,5).
Funktionsdeklarationen können aus mehreren Klauseln bestehen, die durch ein Semikolon getrennt sind. Die Argumente in jeder dieser Klauseln werden durch Mustervergleich ausgewertet. Die folgende Funktion gibt 'Tupel' zurück, wenn das Argument ein Tupel im Formular ist: {test, X}, wobei X einen beliebigen Wert haben kann. Es wird 'Liste' zurückgeben, wenn das Argument eine Liste der Länge 2 in der Form ["test", X] ist, und in allen anderen Fällen wird '{error, "Reason"}' zurückgegeben:
function({test, X}) -> tuple;
function(["test", X]) -> list;
function(_) -> {error, "Reason"}.
Wenn das Argument kein Tupel ist, wird die zweite Klausel ausgewertet. Wenn das Argument keine Liste ist, wird die dritte Klausel ausgewertet.
Funktionsdeklarationen können aus sogenannten "Guards" oder "Guard Sequences" bestehen. Diese Guards sind Ausdrücke, die die Bewertung einer Funktion einschränken. Eine Funktion mit Guards wird nur ausgeführt, wenn alle Guard-Ausdrücke einen wahren Wert ergeben. Mehrere Guards können durch ein Semikolon getrennt werden.
function_name(Argument) when Guard1; Guard2; ... GuardN -> (...).
Die Funktion 'Funktionsname' wird nur ausgewertet, wenn die Guardsequenz wahr ist. Die folgende Funktion gibt nur dann true zurück, wenn sich das Argument X
im richtigen Bereich befindet (0..15):
in_range(X) when X>=0; X<16 -> true;
in_range(_) -> false.
Listenverständnis
Listenverständnisse sind ein syntaktisches Konstrukt, um eine Liste basierend auf vorhandenen Listen zu erstellen.
In erlang hat ein Listenverständnis die Form [Expr || Qualifier1, ..., QualifierN]
.
Wobei Qualifier entweder Generatoren sind Pattern <- ListExpr
oder filtern Sie wie integer(X)
bewerten Sie entweder true
oder false
.
Das folgende Beispiel zeigt ein Listenverständnis mit einem Generator und zwei Filtern.
[X || X <- [1,2,a,3,4,b,5,6], integer(X), X > 3].
Das Ergebnis ist eine Liste, die nur ganze Zahlen über 3 enthält.
[4,5,6]
Erlang Shell starten und stoppen
Starten der Erlang-Shell
Auf einem UNIX-System starten Sie die Erlang-Shell an einer Eingabeaufforderung mit dem Befehl erl
Beispiel:
$ erl
Erlang/OTP 18 [erts-7.0] [source] [64-bit] [smp:8:8] [async-threads:10] [hipe] [kernel-poll:false]
Eshell V7.0 (abort with ^G)
1>
Der Text, der beim Starten der Shell angezeigt wird, enthält Informationen über die von Ihnen verwendete Erlang-Version sowie weitere nützliche Informationen zum Erlang-System.
Um die Shell unter Windows zu starten, klicken Sie auf das Erlang-Symbol im Windows-Startmenü.
Stoppen der Erlang-Shell
Zum kontrollierten Beenden der Erlang-Shell geben Sie Folgendes ein:
Erlang/OTP 18 [erts-7.0] [source] [64-bit] [smp:8:8] [async-threads:10] [hipe] [kernel-poll:false]
Eshell V7.0 (abort with ^G)
1> q().
Sie können die Erlang-Shell auch beenden, indem Sie auf UNIX-Systemen die Tastenkombination Strg + C oder unter Windows die Tastenkombination Strg + Pause drücken.
Erlang/OTP 18 [erts-7.0] [source] [64-bit] [smp:8:8] [async-threads:10] [hipe] [kernel-poll:false]
Eshell V7.0 (abort with ^G)
1>
BREAK: (a)bort (c)ontinue (p)roc info (i)nfo (l)oaded
(v)ersion (k)ill (D)b-tables (d)istribution
Wenn Sie dann a drücken (zum Abbruch), verlassen Sie die Shell direkt.
Andere Möglichkeiten, die erlang-Shell zu verlassen, sind: init:stop()
was dasselbe wie q()
oder erlang:halt()
.
Musterabgleich
Eine der häufigsten Operationen in erlang ist der Musterabgleich. Es wird verwendet, wenn einer Variablen ein Wert zugewiesen wird, in Funktionsdeklarationen und in Kontrollflussstrukturen wie case
und receive
Anweisungen. Eine Musterabgleichoperation erfordert mindestens zwei Teile: ein Muster und einen Begriff, mit dem das Muster abgeglichen wird.
Eine variable Zuweisung in erlang sieht folgendermaßen aus:
X = 2.
In den meisten Programmiersprachen ist die Semantik dieser Operation einfach: Binden Sie einen Wert ( 2
) an einen Namen Ihrer Wahl (die Variable - in diesem Fall X
). Erlang hat einen etwas anderen Ansatz: Passen Sie das Muster auf der linken Seite ( X
) an den Ausdruck auf der rechten Seite ( 2
) an. In diesem Fall ist der Effekt derselbe: Die Variable X
ist jetzt an den Wert 2
gebunden. Mit Pattern Matching können Sie jedoch strukturiertere Zuweisungen durchführen.
{Type, Meta, Doc} = {document, {author, "Alice"}, {text, "Lorem Ipsum"}}.
Diese Abgleichoperation wird durchgeführt, indem die Struktur des rechten Termes analysiert wird und alle Variablen auf der linken Seite auf die entsprechenden Werte des Terms angewendet werden, so dass die linke Seite der rechten Seite entspricht. In diesem Beispiel ist Type
an den Begriff: document
, Meta
to {author, "Alice"}
und Doc
an {text, "Lorem Ipsum"}
. In diesem speziellen Beispiel wird angenommen, dass die Variablen: Type
, Meta
und Doc
ungebunden sind , sodass jede Variable verwendet werden kann.
Musteranpassungen können auch mithilfe gebundener Variablen erstellt werden.
Identifier = error.
Die Variable Identifier
wird nun auf den Wert gebunden error
. Die folgende Mustervergleichsoperation funktioniert, da die Struktur übereinstimmt und der Identifier
die gebundene Variable denselben Wert hat wie der entsprechende Teil auf der rechten Seite.
{Identifier, Reason} = {error, "Database connection timed out."}.
Eine Musterabgleichoperation schlägt fehl, wenn zwischen dem Ausdruck auf der rechten Seite und dem Muster auf der linken Seite ein Konflikt besteht. Das folgende Spiel wird fehlschlagen, weil Identifier
auf den Wert gebunden ist , error
, wich keinen angemessenen Ausdruck auf der rechten Seite Begriff.
{Identifier, Reason} = {fail, "Database connection timed out."}.
> ** exception error: no match of right hand side value {fail,"Database ..."}