Поиск…


замечания

«Erlang - это язык программирования, первоначально разработанный в Лаборатории компьютерных наук Эрикссон. OTP (Open Telecom Platform) - это набор промежуточного программного обеспечения и библиотек в Эрланге. Erlang / OTP был протестирован в ряде продуктов Ericsson для создания надежных отказоустойчивых распределенные приложения, например AXD301 (ATM-коммутатор). Erlang / OTP в настоящее время поддерживается модулем Erlang / OTP в Ericsson »( erlang.org )

Начни здесь

Инструкции по установке см. В разделе « Установка» .

связи

  1. Официальный сайт Erlang: https://www.erlang.org
  2. Популярный менеджер пакетов для Erlang и Elixir: http://hex.pm
  3. Шаблоны Erlang: http://www.erlangpatterns.org/

Версии

Версия Примечания к выпуску Дата выхода
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

Привет, мир

Есть две вещи, которые вам нужно знать при написании приложения «hello world» в Erlang:

  1. Исходный код написан на языке программирования erlang с использованием текстового редактора по вашему выбору
  2. Затем приложение выполняется в виртуальной машине 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 ..."}


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow