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 .

  1. Sito ufficiale di Erlang: https://www.erlang.org
  2. Popolare gestore di pacchetti per Erlang ed Elixir: http://hex.pm
  3. Modelli di Erlang: http://www.erlangpatterns.org/

Versioni

Versione Note di rilascio Data di rilascio
19.2 http://erlang.org/download/otp_src_19.2.readme 2016/12/14
19.1 http://erlang.org/download/otp_src_19.1.readme 2016/09/21
19,0 http://erlang.org/download/otp_src_19.0.readme 2016/06/21
18,3 http://erlang.org/download/otp_src_18.3.readme 2016/03/15
18.2.1 http://erlang.org/download/otp_src_18.2.1.readme 2015/12/18
18.2 http://erlang.org/download/otp_src_18.2.readme 2015/12/16
18.1 http://erlang.org/download/otp_src_18.1.readme 2015/09/22
18,0 http://erlang.org/download/otp_src_18.0.readme 2015/06/24
17.5 http://erlang.org/download/otp_src_17.5.readme 2015/04/01
17,4 http://erlang.org/download/otp_src_17.4.readme 2014/12/10
17,3 http://erlang.org/download/otp_src_17.3.readme 2014/09/17
17.1 http://erlang.org/download/otp_src_17.1.readme 2014/06/24
17,0 http://erlang.org/download/otp_src_17.0.readme 2014/04/07
R16B03-1 http://erlang.org/download/otp_src_R16B03-1.readme 2014/01/23
R16B03 http://erlang.org/download/otp_src_R16B03.readme 2013/12/09
R16B02 http://erlang.org/download/otp_src_R16B02.readme 2013/09/17
R16B01 http://erlang.org/download/otp_src_R16B01.readme 2013/06/18
R16B http://erlang.org/download/otp_src_R16B.readme 2013/02/25

Ciao mondo

Ci sono due cose che devi sapere quando scrivi un'applicazione "ciao mondo" in Erlang:

  1. Il codice sorgente è scritto nel linguaggio di programmazione di erlang usando l'editor di testo di tua scelta
  2. 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 da hello_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 che hello_world() (nessun argomento) è identificato da hello_world/0 nella VM e hello_world(Some_Arg) come hello_world/1 .
  • io:format("Hello, World!~n", []) Dal modulo io , viene chiamata la funzione format/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 funzione c su un atomo hello . Questo in effetti dice a Erlang di trovare il file hello.erl , compilarlo in un modulo (un file denominato hello.beam verrà generato nella directory) e caricarlo nell'ambiente.
  • {ok, hello} - questo è il risultato di chiamare la funzione c sopra. È una tupla contenente un atom ok e un atomo hello . Le funzioni di Erlang solitamente restituiscono {ok, Something} o {error, Reason} .
  • hello:hello_world() - questo chiama una funzione hello_world() dal modulo hello .
  • 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 in hello_world() , l'ultima chiamata in quella funzione era in io:format(...) e quella funzione ha restituito ok , 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 ..."}


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow