Статьи / Erlang


Erlang термины

Переменная - неизменный блок памяти, который хранит что-либо. Однажды присвоенное значение (например: MyVar = 12) изменить нельзя. Названия начинаются с заглавной буквы. Переменные могут иметь два состояния: свободное и связанное(например: MyVar = 12).

Сопоставление по образцу - = сначала вычисляется правая часть выражения, затем левая. В случае если получается false, выбрасывается ошибка. Если true, по разному, смотри переменные, Клаузы, Кортежи и т.д.

Атомы - Не-числовые константы. Начинаются с прописной буквы(в виде реги: ^[a-z]+_@\.) пр: year, month ip@site.ru и т.д., если не заключены в одинарные кавычки. В одинарных кавычках могут начинаться с заглавной буквы. 'Ip@_sho.t' и т.д. Равны сами себе.

Кортеж - { person: man }, или { type: { name, family }, 10 }
объединяют ключ: значение либо значение, значение, может быть любая вложенность.

L = {line, 10, 45}.
{line, A, B} = L.

% теперь А -> 10, B -> 45
% после процента в Erlang идет комментарий



Списки - В переводе не нуждаются. Элементы разделяются запятой

A = [10, 20, pre, {line, 10, 45}].
% 10
% 20
% pre
% {line, 10, 45}


Список можно разделить на Голову и Хвост во время присвоения переменным. Разделитель - вертикальная черта |

List = [10, 20, pre, {line, 10, 45}].

[X, Y | Any] = List.

% X->10
% Y->20
% Any->pre, {line, 10, 45}


Строки - Списки цифр.

Клауза - clause - условие, формула. Сопоставление аргументов функции. Сравни условиям if в других языках программирования. Если условие совпадает, то выполняем код, если нет ищем следующее соответсвие...
Клаузы разделяются точкой с запятой, в конце всех клауз ставится точка.

func({point, X, Y}) -> X + Y;
%первая клауза, соответствие будет func({point, 10, 30})

func({fio, F}) -> F.
%вторая клауза, соответствие будет func({fio, 'Wachovski'})


Модули - Блоки кода. Сохраняются в файлы .erl, которые затем компилируются в файлы .beam (Bogdan’s Erlang Abstract Machine)

% modulename.erl, [func/1] - у функции func один аргумент

-module(modulename).
-export([func/1]).

func({point, X, Y}) -> X + Y;

func({fio, F}) -> F.


-export(fn). нужна, чтобы использовать функцию func вне модуля


1> cd("/path_to_erlang").
2> c(modulename).
{ok,modulename}
3> modulename:func({fio, 'Mobidik'}).
'Mobidik'


Арность(en.arity) - количество аргументов передаваемых функции. Одинаково называемые функции с разным количеством элементов - разные функции. Разделяются точкой(.), а не точкой с запятой.

Анонимная функция(en.fun) - функция без имени, может присваиваться переменной или быть переданной как параметр.


Calc = fun({sum,A,B}) -> A + B;
({minus,A,B}) -> A - B
end.
Calc({sum,10,12}).
%22
Calc({minus,10,12}).
%-2

%или
Sum = fun(A,B) -> A + B end.
Sum(2,3).
%5