Erlang (programspråk)

Från Rilpedia

Hoppa till: navigering, sök
Wikipedia_letter_w.pngTexten från svenska WikipediaWikipedialogo_12pt.gif
rpsv.header.diskuteraikon2.gif

Erlang är ett generellt programspråk från början (1987) utvecklat av telebolaget Ericsson för att användas i hårdvara för telekommunikation. Det är egentligen en fullständig runtime-miljö och innefattar delar som vanligtvis annars ingår i operativsystemet.

Språket är ett funktionellt programspråk, utan deklarationer och med dynamisk typning och tillåter parallell bearbetning.

Språket är namngivet efter Agner Krarup Erlang (eller Ericsson Language). 1998 släpptes språket fritt (öppen källkod) och används numera av flera internationella teleföretag, till exempel Nortel och T-Mobile.

Innehåll

Kodexempel

Fakultetfunktion

-module(test).
-export([fac/1]).

fac(0) -> 1;
fac(N) -> N * fac(N-1).

Message passing

Grundläggande i semantiken för Erlang är Processer, vilket är isolerade från varandra. Det enda sättet för processer att kommunicera är genom att skicka meddelande mellan varandra.

Nedan följer ett exempel över en modul med två publika funktioner:

  • create_server - Funktion för att skapa en process som lyssnar på meddelanden.
  • greet - Funktion för att skicka ett meddelande till processen.
-module(messages).
-export([create_server/0, greet/2]).

create_server() -> spawn_link(fun() -> server_proc() end).

% Serverproceduren som tar emot meddelanden.
server_proc() ->
    receive 
        {meddelande,A} -> io:fwrite("Meddelande: "++A)
    end,
    server_proc(). 

% Server = process-ID för servern.
% Medd = meddelandet.
greet(Server,Medd) ->
    Server!{meddelande,Medd}.

Funktionen create_server returnerar en process identitet (PId), vilken används av greet-funktionen för att veta till vilken process meddelande skall skickas.

PId = messages:create_server().
messages:greet(PId, "Hello world!").

Det går även att namnge processer med register(RegName, Pid) funktionen.

PId = messages:create_server().
register(my_server, PId).
messages:greet(my_server, "Hello world!").

Case-satser

-module(case).
-export([conditional/1]).
conditional(P) ->
    % För att visa, anta att P inte bör skyddas av funktionsklausulen
    case P of
        P when is_integer(P) ->
            2*P;
        P when is_list(P) ->
            hd(P);
        _ ->
            fel
    end. 

Mönstermatchning

% Sker vid 
% 1. Funktionsanrop, 
% 2. case/receieve/try 
% 3. (=)-operatorn
-module(matchning).
-export([funktion/1,
        konditionell/1,
        tilldelning/0]).
funktion([]) ->
    [];
funktion([First | _Tail]) ->    
    First.
konditionell(X) ->    
    case X of
        A when is_atom(A) ->            
            A;
        B when is_integer(B) ->
            B;
        _ ->
            fel
    end.
tilldelning() ->
    % A binds till 1
    % B binds till [2,3]
    [A | B] = [1,2,3],
    % C binds till 2, D till 3
    [C, D] = B,
    A + C + D.
  

List-comprehensions

-module(listcomp).
-export([squarePositives/1]).
squarePositives(List) ->
    [A*A || A <- List, A > 0].

Externa länkar

Personliga verktyg