Erlang Language учебник
Начало работы с языком Erlang
Поиск…
замечания
«Erlang - это язык программирования, первоначально разработанный в Лаборатории компьютерных наук Эрикссон. OTP (Open Telecom Platform) - это набор промежуточного программного обеспечения и библиотек в Эрланге. Erlang / OTP был протестирован в ряде продуктов Ericsson для создания надежных отказоустойчивых распределенные приложения, например AXD301 (ATM-коммутатор). Erlang / OTP в настоящее время поддерживается модулем Erlang / OTP в Ericsson »( erlang.org )
Начни здесь
Инструкции по установке см. В разделе « Установка» .
связи
- Официальный сайт Erlang: https://www.erlang.org
- Популярный менеджер пакетов для Erlang и Elixir: http://hex.pm
- Шаблоны Erlang: http://www.erlangpatterns.org/
Версии
Привет, мир
Есть две вещи, которые вам нужно знать при написании приложения «hello world» в Erlang:
- Исходный код написан на языке программирования erlang с использованием текстового редактора по вашему выбору
- Затем приложение выполняется в виртуальной машине erlang . В этом примере мы будем взаимодействовать с erlang VM thorugh the erlang shell.
Сначала исходный код приложения:
Создайте новый файл hello.erl
содержащий следующее:
-module(hello).
-export([hello_world/0]).
hello_world() ->
io:format("Hello, World!~n", []).
Давайте быстро посмотрим, что это значит:
-
-module(hello).
Все функции erlang существуют внутри модуля . Модули затем используются для создания приложений, которые представляют собой набор модулей. Эта первая строка состоит в том, чтобы идентифицировать этот модуль, а именно hello . Модули можно сравнить с пакетами Java -
-export([hello_world/0]).
Сообщает компилятору, который функционирует, чтобы сделать «общедоступным» (по сравнению с языками OO) и арность соответствующей функции. Арность - это количество аргументов, которые выполняет функция. Поскольку в erlang функция с 1 аргументом рассматривается как другая функция, чем одна с двумя аргументами, хотя имя может быть точно таким же. Т.е.,hello_world/0
- совершенно другая функция, например,hello_world/1
. -
hello_world()
Это имя функции. Параметр->
указывает на переход к реализации (телу) функции. Это можно прочитать так: «hello_world () определяется как ...». Обратите внимание, чтоhello_world()
(без аргументов) идентифицируетсяhello_world/0
в VM иhello_world(Some_Arg)
какhello_world/1
. -
io:format("Hello, World!~n", [])
Из модуляio
вызывается функцияformat/2
, которая является функцией стандартного вывода.~n
- спецификатор формата, который означает печать новой строки.[]
- список переменных для печати, указанных спецификаторами формата в выходной строке, что в данном случае ничего. - Все утверждения erlang должны заканчиваться на a
.
(Точка).
В Erlang возвращается результат последнего оператора в функции.
Теперь давайте запустим наше приложение:
Запустите оболочку hello.erl
из того же каталога, что и файл hello.erl
:
$ erl
Вы должны получить подсказку, которая выглядит примерно так (ваша версия может быть другой):
Eshell V8.0 (abort with ^G)
1>
Теперь введите следующие команды:
1> c(hello).
{ok,hello}
2> hello:hello_world().
Hello, World!
ok
Давайте переходим через каждую строку один за другим:
-
c(hello)
- эта команда вызывает функциюc
на атомеhello
. Это эффективно говорит Erlang найти файлhello.erl
, скомпилировать его в модуль (файл с именемhello.beam
будет сгенерирован в каталоге) и загрузить его в среду. -
{ok, hello}
- это результат вызова функцииc
выше. Это кортеж, содержащий атомok
и атомныйhello
. Обычно функции Erlang возвращают либо{ok, Something}
либо{error, Reason}
. -
hello:hello_world()
- этоhello_world()
функцииhello_world()
из модуляhello
. -
Hello, World!
- это то, что печатает наша функция. -
ok
- это то, что вернула наша функция. Поскольку Erlang является функциональным языком программирования, каждая функция возвращает что-то . В нашем случае, хотя мы не вернули ничего вhello_world()
, последний вызов этой функции был вio:format(...)
и эта функция вернулась вok
, что в свою очередь возвращает нашу функцию.
Модули
Модуль erlang - это файл с несколькими функциями, сгруппированными вместе. Обычно этот файл имеет расширение .erl
.
Модуль «Hello World» с именем hello.erl
показан ниже
-module(hello).
-export([hello_world/0]).
hello_world() ->
io:format("Hello, World!~n", []).
В файле требуется объявить имя модуля. Как показано выше в строке 1. Имя модуля и имя файла перед расширением .erl
должны быть одинаковыми.
функция
Функция представляет собой набор команд, которые сгруппированы вместе. Эти сгруппированные инструкции вместе выполняют определенную задачу. В erlang все функции возвращают значение при их вызове.
Ниже приведен пример функции, которая добавляет два числа
add(X, Y)-> X + Y.
Эта функция выполняет операцию добавления с значениями X и Y и возвращает результат. Функция может использоваться как ниже
add(2,5).
Объявления функций могут состоять из нескольких предложений, разделенных точкой с запятой. Аргументы в каждом из этих предложений оцениваются путем сопоставления шаблонов. Следующая функция вернет «кортеж», если Аргумент является кортежем в форме: {test, X}, где X может быть любым значением. Он вернет «список», если Аргумент - это список длины 2 в форме [«test», X], и он вернет «{ошибка,« Причина »} в любом другом случае:
function({test, X}) -> tuple;
function(["test", X]) -> list;
function(_) -> {error, "Reason"}.
Если аргумент не является кортежем, будет оценено второе предложение. Если аргумент не является списком, будет оценено третье предложение.
Объявление функций может состоять из так называемых «гвардейских» или «гвардейских последовательностей». Эти гвардейцы являются выражениями, которые ограничивают оценку функции. Функция с гвардейцами выполняется только тогда, когда все выражения Guard выражают истинное значение. Несколько гвардейцев могут быть разделены точкой с запятой.
function_name(Argument) when Guard1; Guard2; ... GuardN -> (...).
Функция «имя_функции» будет оцениваться только тогда, когда Guard Sequence верна. Функция follwing вернет true, только если аргумент X
находится в правильном диапазоне (0..15):
in_range(X) when X>=0; X<16 -> true;
in_range(_) -> false.
Учет списка
Перечисления списков представляют собой синтаксическую конструкцию для создания списка на основе существующих списков.
В erlang понимание списка имеет форму [Expr || Qualifier1, ..., QualifierN]
.
Если квалификаторы являются либо генераторами Pattern <- ListExpr
либо фильтруют как integer(X)
оценивая либо true
либо false
.
В следующем примере показано понимание списка с одним генератором и двумя фильтрами.
[X || X <- [1,2,a,3,4,b,5,6], integer(X), X > 3].
Результатом является список, содержащий только целые числа больше 3.
[4,5,6]
Запуск и остановка оболочки Erlang
Запуск оболочки Erlang
В системе UNIX вы запускаете оболочку Erlang из командной строки с помощью команды erl
Пример:
$ 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>
Текст, который показывает, когда вы запускаете оболочку, сообщает вам информацию о том, какую версию Erlang вы используете, а также другую полезную информацию о системе erlang.
Чтобы запустить оболочку в Windows, щелкните значок Erlang в меню запуска Windows.
Остановка оболочки Эрланг
Для управляемого выхода оболочки erlang вы вводите:
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().
Вы также можете выйти из оболочки Erlang, нажав Ctrl + C в системах UNIX или Ctrl + Break в Windows, в результате чего вы получите следующую подсказку:
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
Если вы затем нажмете (для отмены), вы сразу же выйдете из оболочки.
Другие способы выхода из оболочки erlang: init:stop()
что делает то же самое, что и q()
или erlang:halt()
.
Соответствие шаблону
Одной из наиболее распространенных операций в erlang является сопоставление образцов. Он используется при назначении значения переменной, в объявлениях функций и в структурах потока управления, таких как case
and receive
statements. Для операции сопоставления шаблонов требуется как минимум 2 части: шаблон и термин, в котором сопоставляется шаблон.
Назначение переменной в erlang выглядит следующим образом:
X = 2.
В большинстве языков программирования семантика этой операции проста: привяжите значение ( 2
) к названию по вашему выбору (переменная - в этом случае X
). Эрланг имеет несколько иной подход: сопоставьте шаблон с левой стороны ( X
) с термином справа ( 2
). В этом случае эффект тот же: переменная X
теперь привязана к значению 2
. Однако при сопоставлении с образцами вы можете выполнять более структурированные задания.
{Type, Meta, Doc} = {document, {author, "Alice"}, {text, "Lorem Ipsum"}}.
Эта операция сопоставления выполняется, анализируя структуру члена правой стороны и применяя все переменные в левой части к соответствующим значениям термина, так что левая сторона равна правой стороне. В этом примере Type
привязан к термину: document
, Meta
to {author, "Alice"}
и Doc
to {text, "Lorem Ipsum"}
. В этом конкретном примере переменные: Type
, Meta
и Doc
считаются несвязанными , поэтому каждая переменная может использоваться.
Шаблонные сопоставления также могут быть построены с использованием связанных переменных.
Identifier = error.
Identifier
переменной теперь привязан к error
значения. Следующая операция сопоставления шаблонов работает, поскольку структура соответствует, а связанная переменная Identifier
имеет то же значение, что и соответствующая правая часть термина.
{Identifier, Reason} = {error, "Database connection timed out."}.
Операция сопоставления с образцом завершается с ошибкой, когда есть несоответствие между правой стороной и левым рисунком стороны. Следующее совпадение не будет выполнено, потому что Identifier
привязан к error
значения, у которой нет соответствующего выражения с правой стороны.
{Identifier, Reason} = {fail, "Database connection timed out."}.
> ** exception error: no match of right hand side value {fail,"Database ..."}