Szukaj…


Uwagi

Każdy typ danych w erlang nazywa się Term. Jest to ogólna nazwa, która oznacza dowolny typ danych .

Liczby

W Erlang liczby są liczbami całkowitymi lub liczbami zmiennoprzecinkowymi. Erlang używa arbitralnej precyzji dla liczb całkowitych (bignów), więc ich wartości są ograniczone tylko wielkością pamięci twojego systemu.

1> 11.
11
2> -44.
-44
3> 0.1.
0.1
4> 5.1e-3.
0.0051
5> 5.2e2.
520.0

Liczby mogą być używane w różnych bazach:

1> 2#101.
5
2> 16#ffff.
65535

Notacja z prefiksem $ zwraca wartość całkowitą dowolnego znaku ASCII / Unicode:

3> $a.
97
4> $A.
65
5> $2.
50
6> $🤖.
129302

Atomy

Atom jest obiektem o nazwie, która jest identyfikowana tylko przez samą nazwę.

Atomy są zdefiniowane w Erlangu za pomocą literałów atomowych, które są albo

  • niecytowany ciąg, który zaczyna się od małej litery i zawiera tylko litery, cyfry, znaki podkreślenia lub znak @ , lub
  • Ciąg pojedynczego cudzysłowu

Przykłady

1> hello.
hello

2> hello_world.
hello_world

3> world_Hello@.
world_Hello@

4> '1234'.     
'1234'

5> '!@#$%% ä'.
'!@#$%% ä'

Atomy stosowane w większości programów Erlang

Niektóre atomy pojawiają się w prawie każdym programie Erlang, w szczególności ze względu na ich użycie w bibliotece standardowej.

  • true i false są używane do oznaczenia odpowiednich wartości logicznych
  • ok jest zwykle używane jako wartość zwracana przez funkcję wywoływaną tylko dla jej efektu lub jako część wartości zwracanej, w obu przypadkach w celu oznaczenia pomyślnego wykonania
  • W ten sam sposób error jest używany do oznaczenia warunku błędu, który nie gwarantuje wczesnego powrotu z górnych funkcji
  • undefined jest zwykle używana jako symbol zastępczy dla nieokreślonej wartości

Użyj jako tagi

ok i error są dość często używane jako część krotki, w której pierwszy element krotki sygnalizuje sukces, podczas gdy kolejne elementy zawierają rzeczywistą wartość zwracaną lub warunek błędu:

func(Input) ->
    case Input of
        magic_value ->
            {ok, got_it};
        _ ->
            {error, wrong_one}
    end.

{ok, _} = func(SomeValue).

Przechowywanie

Podczas korzystania z atomów należy pamiętać, że są one przechowywane w swojej własnej tabeli globalnej w pamięci, a ta tabela nie jest gromadzona w pamięci, więc dynamiczne tworzenie atomów jest szczególnie odradzane, gdy użytkownik może wpływać na nazwę atomu.

Pliki binarne i ciągi bitów

Binarny jest sekwencją 8-bitowych bajtów bez znaku.

1> <<1,2,3,255>>.
<<1,2,3,255>>
2> <<256,257,258>>.
<<0,1,2>>
3> <<"hello","world">>.
<<"helloworld">>

Łańcuch bitów to uogólniony plik binarny, którego długość w bitach niekoniecznie jest wielokrotnością liczby 8.

1> <<1:1, 0:2, 1:1>>.
<<9:4>> % 4 bits bitstring

Krotki

Krotka to uporządkowana sekwencja innych terminów Erlang o stałej długości. Każdy element w krotce może być dowolnym rodzajem terminu (dowolnym typem danych).

1> {1, 2, 3}.
{1,2,3}
2> {one, two, three}.
{one,two,three}
3> {mix, atom, 123, {<<1,2>>, [list]}}.
{mix,atom,123,{<<1,2>>,[list]}}

Listy

Lista w Erlang jest sekwencją zero lub więcej terminów Erlang, zaimplementowaną jako pojedynczo połączona lista. Każdy element na liście może być dowolnym rodzajem terminu (dowolnym typem danych).

1> [1,2,3].
[1,2,3]
2> [wow,1,{a,b}].     
[wow,1,{a,b}]

Głowa listy jest pierwszym elementem listy.

Ogon listy jest resztą listy (bez głowy). To także lista.
Możesz użyć hd/1 i tl/1 lub dopasować do [H|T] aby uzyskać nagłówek i koniec listy.

3> hd([1,2,3]).
1
4> tl([1,2,3]).
[2,3]
5> [H|T] = [1,2,3].
[1,2,3]
6> H.
1
7> T.
[2,3]

Przygotowanie elementu do listy

8> [new | [1,2,3]].
[new,1,2,3]

Listy konkatenacyjne

9> [concat,this] ++ [to,this].
[concat,this,to,this]

Smyczki

W Erlang ciągi nie są oddzielnym typem danych: są to tylko liczby całkowite reprezentujące punkty kodowe ASCII lub Unicode:

> [97,98,99].
"abc"
> [97,98,99] =:= "abc".
true
> hd("ABC").
65

Kiedy powłoka Erlang wydrukuje listę, próbuje zgadnąć, czy rzeczywiście miał to być ciąg znaków. Możesz wyłączyć to zachowanie, wywołując shell:strings(false) :

> [8].
"\b"
> shell:strings(false).
true
> [8].
[8]

W powyższym przykładzie liczba całkowita 8 jest interpretowana jako znak kontrolny ASCII dla backspace, który powłoka uważa za „prawidłowy” znak w ciągu.

Identyfikatory procesów (Pid)

Każdy proces w erlang ma identyfikator procesu ( Pid ) w tym formacie <xxx> , gdzie x jest liczbą naturalną. Poniżej znajduje się przykład Pid

<0.1252.0>

Pid może być używany do wysyłania wiadomości do procesu za pomocą „bang” ( ! ), Również Pid może być powiązany ze zmienną, obie są pokazane poniżej

MyProcessId = self().
MyProcessId ! {"Say Hello"}.

Przeczytaj więcej o tworzeniu procesów i ogólnie o procesach w erlang

Funs

Erlang to funkcjonalny język programowania. Jedną z funkcji języka programowania funkcji jest obsługa funkcji jako danych (obiektów funkcjonalnych).

  • Przekaż funkcję jako argument do innej funkcji.
  • Zwraca funkcję jako wynik funkcji.
  • Funkcje wstrzymania w strukturze danych.

W Erlang funkcje te nazywane są zabawami. Zabawy są funkcjami anonimowymi.

1> Fun = fun(X) -> X*X end.
#Fun<erl_eval.6.52032458>
2> Fun(5).
25

Fani mogą mieć także kilka klauzul.

3> AddOrMult = fun(add,X) -> X+X;
3>                (mul,X) -> X*X 
3> end.
#Fun<erl_eval.12.52032458>
4> AddOrMult(mul,5).
25
5> AddOrMult(add,5).
10

Możesz także używać funkcji modułu jako funs ze składnią: fun Module:Function/Arity .
Na przykład, weźmy funkcję max z modułu lists , który ma arity 1.

6> Max = fun lists:max/1.
#Fun<lists.max.1>
7> Max([1,3,5,9,2]). 
9

Mapy

Mapa to tablica lub słownik asocjacyjny złożony z par (klucz, wartość).

1> M0 = #{}.
#{}
2> M1 = #{ "name" => "john", "age" => "28" }.
#{"age" => "28","name" => "john"}
3> M2 = #{ a => {M0, M1} }.
#{a => {#{},#{"age" => "28","name" => "john"}}}

Aby zaktualizować mapę:

1> M = #{ 1 => x }.
2> M#{ 1 => c }.
#{1 => c}
3> M.
#{1 => x}

Zaktualizuj tylko niektóre istniejące klucze:

1> M = #{ 1 => a, 2 => b}.
2> M#{ 1 := c, 2:= d }.
#{1 => c,2 => d}
3> M#{ 3 := c }.
** exception error: {badkey,3}

Dopasowywanie wzorów:

1> M = #{ name => "john", age => 28 }.
2> #{ name := Name, age := Age } = M.
3> Name.
"john"
4> Age.
28

Składnia bitów: Domyślnie

Wyjaśnienie dokumentu Erlanga na temat składni bitowej:

4.4 Domyślne

[Początek pominięty: << 3.14 >> nie jest nawet legalną składnią.]

Rozmiar domyślny zależy od typu. Dla liczb całkowitych jest to 8. Dla liczb zmiennoprzecinkowych jest to 64. W przypadku plików binarnych jest to rzeczywisty rozmiar określonego pliku binarnego:

    1> Bin = << 17/integer, 3.2/float, <<97, 98, 99>>/binary >>. 
    <<17,64,9,153,153,153,153,153,154,97,98,99>>
      ^ |<-------------------------->|<------>|
      |            float=64           binary=24
  integer=8


    2> size(Bin). % Returns the number of bytes:
    12            % 8 bits + 64 bits + 3*8 bits = 96 bits => 96/8 = 12 bytes

W dopasowaniu segment binarny bez rozmiaru jest dozwolony tylko na końcu wzorca, a domyślny rozmiar to reszta pliku binarnego po prawej stronie dopasowania:

25> Bin = <<97, 98, 99>>. 
<<"abc">>

26> << X/integer, Rest/binary >> = Bin. 
<<"abc">>

27> X. 
97

28> Rest. 
<<"bc">>

Wszystkie pozostałe segmenty z typem binarnym we wzorcu muszą określać rozmiar:

12> Bin = <<97, 98, 99, 100>>.         
<<"abcd">>

13> << B:1/binary, X/integer, Rest/binary >> = Bin. %'unit' defaults to 8 for  
<<"abcd">>                    %binary type, total segment size is Size * unit  

14> B.
<<"a">>

15> X.
98

16> Rest.
<<"cd">>

17> << B2/binary, X2/integer, Rest2/binary >> = Bin. 
* 1: a binary field without size is only allowed at the end of a binary pattern


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow