Erlang Language Tutorial
Iniziare con Erlang Language
Ricerca…
Osservazioni
"Erlang è un linguaggio di programmazione originariamente sviluppato presso l'Ericsson Computer Science Laboratory.OTP (Open Telecom Platform) è una raccolta di middleware e librerie in Erlang.Ellang / OTP è stato testato in battaglia in un certo numero di prodotti Ericsson per la costruzione di robusti fault-tolerant applicazioni distribuite, ad esempio AXD301 (switch ATM). Erlang / OTP è attualmente gestito dall'unità Erlang / OTP di Ericsson "( erlang.org )
Comincià qui
Per le istruzioni di installazione, consultare la sezione sull'installazione .
link
- Sito ufficiale di Erlang: https://www.erlang.org
- Popolare gestore di pacchetti per Erlang ed Elixir: http://hex.pm
- Modelli di Erlang: http://www.erlangpatterns.org/
Versioni
Ciao mondo
Ci sono due cose che devi sapere quando scrivi un'applicazione "ciao mondo" in Erlang:
- Il codice sorgente è scritto nel linguaggio di programmazione di erlang usando l'editor di testo di tua scelta
- L'applicazione viene quindi eseguita nella macchina virtuale di erlang . In questo esempio interagiremo con l'erlang VM attraverso la shell di erlang.
Prima il codice sorgente dell'applicazione:
Crea un nuovo file hello.erl
contenente quanto segue:
-module(hello).
-export([hello_world/0]).
hello_world() ->
io:format("Hello, World!~n", []).
Diamo una rapida occhiata a cosa significa:
-
-module(hello).
Tutte le funzioni di erlang esistono all'interno di un modulo . I moduli vengono quindi utilizzati per creare applicazioni, che sono una raccolta di moduli. Questa prima linea è identificare questo modulo, cioè ciao . I moduli possono essere confrontati con i pacchetti di Java -
-export([hello_world/0]).
Indica al compilatore quali funzioni rendere "pubbliche" (rispetto alle lingue OO) e l' arità della funzione pertinente. L'arità è il numero di argomenti che la funzione assume. Dato che in erlang una funzione con 1 argomento è vista come una funzione diversa da una con 2 argomenti anche se il nome potrebbe essere esattamente lo stesso. Cioè,hello_world/0
è una funzione completamente diversa dahello_world/1
per esempio. -
hello_world()
Questo è il nome della funzione.->
indica la transizione all'attuazione (corpo) della funzione. Questo può essere letto come "hello_world () è definito come ...". Prendi nota chehello_world()
(nessun argomento) è identificato dahello_world/0
nella VM ehello_world(Some_Arg)
comehello_world/1
. -
io:format("Hello, World!~n", [])
Dal moduloio
, viene chiamata la funzioneformat/2
function, che è la funzione per l'output standard.~n
è un identificatore di formato che significa stampare una nuova riga.[]
È un elenco di variabili da stampare indicato dagli specificatori di formato nella stringa di output, che in questo caso non è nulla. - Tutte le dichiarazioni di erlang devono terminare con a
.
(punto).
In Erlang, viene restituito il risultato dell'ultima istruzione in una funzione.
Ora, eseguiamo la nostra applicazione:
Avvia la shell di erlang dalla stessa directory del file hello.erl
file:
$ erl
Dovresti ricevere una richiesta simile a questa (la tua versione potrebbe essere diversa):
Eshell V8.0 (abort with ^G)
1>
Ora inserisci i seguenti comandi:
1> c(hello).
{ok,hello}
2> hello:hello_world().
Hello, World!
ok
Passiamo attraverso ciascuna riga una ad una:
-
c(hello)
- questo comando chiama la funzionec
su un atomohello
. Questo in effetti dice a Erlang di trovare il filehello.erl
, compilarlo in un modulo (un file denominatohello.beam
verrà generato nella directory) e caricarlo nell'ambiente. -
{ok, hello}
- questo è il risultato di chiamare la funzionec
sopra. È una tupla contenente un atomok
e un atomohello
. Le funzioni di Erlang solitamente restituiscono{ok, Something}
o{error, Reason}
. -
hello:hello_world()
- questo chiama una funzionehello_world()
dal modulohello
. -
Hello, World!
- questo è ciò che la nostra funzione stampa. -
ok
- questo è ciò che la nostra funzione ha restituito. Dal momento che Erlang è un linguaggio di programmazione funzionale, ogni funzione restituisce qualcosa . Nel nostro caso, anche se non abbiamo restituito nulla inhello_world()
, l'ultima chiamata in quella funzione era inio:format(...)
e quella funzione ha restituitook
, che è a sua volta ciò che la nostra funzione ha restituito.
moduli
Un modulo di erlang è un file con un paio di funzioni raggruppate insieme. Questo file di solito ha estensione .erl
.
Un modulo "Hello World" con nome hello.erl
è mostrato sotto
-module(hello).
-export([hello_world/0]).
hello_world() ->
io:format("Hello, World!~n", []).
Nel file, è necessario dichiarare il nome del modulo. Come mostrato prima nella riga 1. Il nome del modulo e il nome del file prima dell'estensione .erl
devono essere uguali.
Funzione
La funzione è un insieme di istruzioni, che sono raggruppate insieme. Queste istruzioni raggruppate eseguono determinati compiti. In erlang, tutte le funzioni restituiscono un valore quando vengono chiamate.
Di seguito è riportato un esempio di una funzione che aggiunge due numeri
add(X, Y)-> X + Y.
Questa funzione esegue un'operazione di aggiunta con i valori X e Y e restituisce il risultato. La funzione può essere utilizzata come di seguito
add(2,5).
Le dichiarazioni di funzione possono essere costituite da più clausole, separate da un punto e virgola. Gli argomenti in ciascuna di queste clausole sono valutati dalla corrispondenza del modello. La seguente funzione restituirà 'tuple' se l'Argomento è una tupla nel Form: {test, X} dove X può essere qualsiasi valore. Restituirà 'lista', se l'argomento è una lista della lunghezza 2 nella forma ["test", X], e restituirà '{errore,' Motivo '}' in qualsiasi altro caso:
function({test, X}) -> tuple;
function(["test", X]) -> list;
function(_) -> {error, "Reason"}.
Se l'argomento non è una tupla, verrà valutata la seconda clausola. Se l'argomento non è un elenco, verrà valutata la terza clausola.
Le dichiarazioni di funzione possono consistere in cosiddette "guardie" o "sequenze di guardie". Queste guardie sono espressioni che limitano la valutazione di una funzione. Una funzione con le guardie viene eseguita solo quando tutte le espressioni di guardia forniscono un valore reale. Le guardie multiple possono essere separate da un punto e virgola.
function_name(Argument) when Guard1; Guard2; ... GuardN -> (...).
La funzione 'nome_funzione' sarà valutata solo quando la sequenza di guardia è vera. La funzione follwing restituirà true solo se l'argomento X
è nell'intervallo corretto (0..15):
in_range(X) when X>=0; X<16 -> true;
in_range(_) -> false.
Comprensione delle liste
La comprensione delle liste è un costrutto sintattico per creare una lista basata su liste esistenti.
In erlang una comprensione delle liste ha la forma [Expr || Qualifier1, ..., QualifierN]
.
Dove qualificatori sono o generatori Pattern <- ListExpr
o filtro come integer(X)
valuta sia true
che false
.
Il seguente esempio mostra una comprensione di lista con un generatore e due filtri.
[X || X <- [1,2,a,3,4,b,5,6], integer(X), X > 3].
Il risultato è una lista contenente solo numeri interi maggiori di 3.
[4,5,6]
Avvio e arresto della shell di Erlang
Avvio della shell di Erlang
Su un sistema UNIX si avvia la shell di Erlang da un prompt dei comandi con il comando erl
Esempio:
$ 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>
Il testo che mostra quando si avvia la shell fornisce informazioni su quale versione di Erlang è in esecuzione e altre informazioni utili sul sistema di erlang.
Per avviare la shell su Windows fai clic sull'icona di Erlang nel menu Start di Windows.
Fermare la shell di Erlang
Per un'uscita controllata della shell di erlang digiti:
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().
Puoi anche uscire dalla shell di Erlang premendo Ctrl + C sui sistemi UNIX o Ctrl + Break su Windows, che ti porta al seguente prompt:
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
Se premi quindi a (per interrompere) uscirai direttamente dalla shell.
Altri modi di uscire dalla shell di erlang sono: init:stop()
che fa la stessa cosa di q()
o di erlang:halt()
.
Pattern Matching
Una delle operazioni più comuni in erlang è la corrispondenza del modello. Viene utilizzato quando si assegna un valore a una variabile, in dichiarazioni di funzione e in strutture di flusso di controllo come case
e receive
statements. Un'operazione di corrispondenza del modello richiede almeno 2 parti: un modello e un termine contro il quale il modello è abbinato.
Un'assegnazione variabile in erlang assomiglia a questo:
X = 2.
Nella maggior parte del linguaggio di programmazione la semantica di questa operazione è semplice: associa un valore ( 2
) a un nome di tua scelta (la variabile - in questo caso X
). Erlang ha un approccio leggermente diverso: abbina il modello sul lato sinistro ( X
) al termine sul lato destro ( 2
). In questo caso, l'effetto è lo stesso: la variabile X
è ora associata al valore 2
. Tuttavia, con la corrispondenza dei modelli è possibile eseguire compiti più strutturati.
{Type, Meta, Doc} = {document, {author, "Alice"}, {text, "Lorem Ipsum"}}.
Questa operazione di corrispondenza viene eseguita analizzando la struttura del termine del lato destro e applicando tutte le variabili sul lato sinistro ai valori appropriati del termine, in modo che il lato sinistro sia uguale al lato destro. In questo esempio, Type
è associato al termine: document
, Meta
a {author, "Alice"}
e Doc
a {text, "Lorem Ipsum"}
. In questo particolare esempio si presume che le variabili: Type
, Meta
e Doc
non siano associate , in modo che ciascuna variabile possa essere utilizzata.
È inoltre possibile creare abbinamenti di modelli, utilizzando variabili associate.
Identifier = error.
La variabile Identifier
è ora associata error
valore. La seguente operazione di corrispondenza del modello funziona, poiché la struttura corrisponde e la variabile associata Identifier
ha lo stesso valore della parte destra appropriata del termine.
{Identifier, Reason} = {error, "Database connection timed out."}.
Un'operazione di corrispondenza del modello non riesce, quando c'è una mancata corrispondenza tra il termine del lato destro e il modello del lato sinistro. La seguente corrispondenza avrà esito negativo, poiché l' Identifier
è associato error
valore, che non ha un'espressione appropriata sul termine del lato destro.
{Identifier, Reason} = {fail, "Database connection timed out."}.
> ** exception error: no match of right hand side value {fail,"Database ..."}