Erlang Language 튜토리얼
Erlang 언어 시작하기
수색…
비고
Erlang은 원래 Ericsson 컴퓨터 과학 연구소에서 개발 된 프로그래밍 언어로 OTP (Open Telecom Platform)는 Erlang의 미들웨어 및 라이브러리 모음입니다. Erlang / OTP는 강력한 내결함성을 구축하기 위해 여러 가지 에릭슨 제품에서 전투 테스트를 거쳤습니다 (예 : AXD301 (ATM 스위치)). Erlang / OTP는 현재 Ericsson의 Erlang / OTP 부서에서 관리하고 있습니다. "( erlang.org )
여기에서 시작하십시오.
설치 지시 사항은 설치 주제를 참조하십시오.
모래밭
- 공식 얼랑 사이트 : https://www.erlang.org
- Erlang과 Elixir 모두를위한 인기있는 패키지 관리자 : http://hex.pm
- 얼랑 무늬 : http://www.erlangpatterns.org/
버전
안녕하세요 세계
Erlang에서 "hello world"애플리케이션을 작성할 때 알아야 할 두 가지 사항이 있습니다.
- 소스 코드는 선택한 텍스트 편집기를 사용하여 erlang 프로그래밍 언어로 작성됩니다.
- 그런 다음 응용 프로그램이 erlang 가상 시스템 에서 실행됩니다. 이 예제에서 우리는 erlang 쉘을 사용하여 erlang VM과 상호 작용할 것입니다.
먼저 응용 프로그램 소스 코드 :
다음을 포함하는 새 파일 hello.erl
을 작성하십시오.
-module(hello).
-export([hello_world/0]).
hello_world() ->
io:format("Hello, World!~n", []).
이것이 의미하는 바를 간단히 살펴 보겠습니다.
-
-module(hello).
모든 erlang 함수는 모듈 안에 존재 합니다 . 그런 다음 모듈은 모듈 모음 인 응용 프로그램을 작성하는 데 사용됩니다. 첫 번째 줄은이 모듈을 식별하는 것입니다. 즉 hello 입니다. 모듈은 Java의 패키지 와 비교 될 수 있습니다. -
-export([hello_world/0]).
컴파일러에게 어떤 함수가 "public"(OO 언어와 비교 될 때)인지, 그리고 관련 함수의 아티 (arity )를 만들도록 지시합니다. 인수는 함수가 취하는 인수의 수입니다. erlang에서 1 개의 인수를 가진 함수는 2 개의 인수를 가진 함수와는 다른 함수로 보여지기 때문에 이름은 완전히 같을 수 있습니다. 즉,hello_world/0
은 예를 들어hello_world/1
과 완전히 다른 기능입니다. -
hello_world()
함수의 이름입니다.->
는 함수의 구현 (본문)으로 전환하는 것을 나타냅니다. 이것은 "hello_world ()가 ...로 정의 됨"으로 읽을 수 있습니다.hello_world()
(인수 없음)는 VM에서hello_world/0
으로 식별되고hello_world(Some_Arg)
는hello_world/1
로 식별됩니다. -
io:format("Hello, World!~n", [])
모듈io
에서 표준 출력을위한 함수 인format/2
함수format/2
호출합니다.~n
은 새로운 행을 인쇄하는 형식 지정자입니다.[]
는 출력 문자열에 형식 지정자로 표시된 인쇄 할 변수의 목록입니다.이 경우에는 아무 것도 표시되지 않습니다. - 모든 erlang 문은 a로 끝나야합니다
.
(점).
Erlang에서는 함수에서 마지막 명령문의 결과가 리턴됩니다.
이제 애플리케이션을 실행 해 보겠습니다.
hello.erl
파일과 같은 디렉토리에서 erlang 쉘을 시작하십시오 :
$ erl
다음과 같은 프롬프트가 나타납니다 (버전이 다를 수 있음).
Eshell V8.0 (abort with ^G)
1>
이제 다음 명령을 입력하십시오.
1> c(hello).
{ok,hello}
2> hello:hello_world().
Hello, World!
ok
각 줄을 하나씩 차례로 살펴 보겠습니다.
-
c(hello)
-이 명령은 원자hello
에서 함수c
를 호출합니다. 이것은 효과적으로 Erlang에게hello.erl
파일을 찾아 모듈로 컴파일하고 (hello.beam
이라는 파일이 디렉토리에서 생성 될 것입니다) 환경으로로드합니다. -
{ok, hello}
- 위의 함수c
를 호출 한 결과입니다. 그것은 원자ok
와 원자hello
포함하는 튜플입니다. Erlang 함수는 일반적으로{ok, Something}
또는{error, Reason}
중 하나를 반환합니다. -
hello:hello_world()
-hello
모듈에서hello_world()
함수를 호출합니다. -
Hello, World!
- 이것은 우리의 기능이 인쇄하는 것입니다. -
ok
- 이것은 우리 함수가 반환 한 것입니다. Erlang은 함수형 프로그래밍 언어이므로, 모든 함수는 무언가를 반환 합니다 . 우리의 경우hello_world()
에서 아무것도 반환하지 않았지만, 그 함수의 마지막 호출은io:format(...)
이었고 그 함수는ok
반환했습니다. 다시 함수가 반환 한 값입니다.
모듈
erlang 모듈은 몇 개의 함수가 그룹화 된 파일입니다. 이 파일의 확장자는 .erl
입니다.
hello.erl
이라는 이름의 "Hello World"모듈은 아래와 같습니다
-module(hello).
-export([hello_world/0]).
hello_world() ->
io:format("Hello, World!~n", []).
파일에서 모듈 이름을 선언해야합니다. 앞에서 설명한 바와 같이 .erl
확장자 앞에 모듈 이름과 파일 이름이 동일해야합니다.
기능
함수는 함께 그룹화 된 명령 집합입니다. 이러한 그룹화 된 명령어는 함께 특정 작업을 수행합니다. erlang에서는 모든 함수가 호출 될 때 값을 반환합니다.
다음은 두 개의 숫자를 더하는 함수의 예입니다.
add(X, Y)-> X + Y.
이 함수는 X 및 Y 값을 사용하여 추가 연산을 수행하고 결과를 반환합니다. 기능은 다음과 같이 사용할 수 있습니다.
add(2,5).
함수 선언은 세미콜론으로 구분 된 여러 절로 구성 될 수 있습니다. 이 절 각각의 인수는 패턴 일치로 평가됩니다. 다음 함수는 인수가 Form의 튜플 인 경우 'tuple'을 반환합니다. {test, X} 여기서 X는 임의의 값이 될 수 있습니다. Argument가 [ "test", X] 형식으로 길이 2의 목록이고 다른 경우에는 '{error, "Reason"} "을 반환하면'list '를 반환합니다.
function({test, X}) -> tuple;
function(["test", X]) -> list;
function(_) -> {error, "Reason"}.
인수가 튜플이 아니면 두 번째 절이 평가됩니다. 인수가 목록이 아닌 경우 세 번째 절이 평가됩니다.
함수 선언은 소위 'Guards'또는 'Guard Sequences'로 구성 될 수 있습니다. 이 가드는 함수의 평가를 제한하는 표현식입니다. Guard가있는 기능은 모든 Guard Express가 참값을 산출 할 때만 실행됩니다. 여러 가드는 세미콜론으로 구분할 수 있습니다.
function_name(Argument) when Guard1; Guard2; ... GuardN -> (...).
'function_name'함수는 Guard Sequence가 true 일 때만 평가됩니다. 인수 X
가 적절한 범위 (0..15)에있는 경우에만 다음 함수가 true를 반환합니다.
in_range(X) when X>=0; X<16 -> true;
in_range(_) -> false.
목록 이해력
목록 내포는 기존 목록을 기반으로 목록을 작성하는 구문 구조입니다.
Erlang에서리스트의 이해력은 [Expr || Qualifier1, ..., QualifierN]
.
한정자는 Generators 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에서 쉘을 시작하려면 Windows 시작 메뉴에서 Erlang 아이콘을 클릭하십시오.
Erlang 셸 중지
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().
UNIX 시스템에서 Ctrl + C를 누르거나 Windows에서 Ctrl + Break를 눌러 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>
BREAK: (a)bort (c)ontinue (p)roc info (i)nfo (l)oaded
(v)ersion (k)ill (D)b-tables (d)istribution
그런 다음 a (abort)를 누르면 쉘이 직접 종료됩니다.
erlang 쉘을 종료하는 다른 방법은 다음과 같습니다 : init:stop()
q()
또는 erlang:halt()
와 동일한 작업을하는 init:stop()
패턴 매칭
erlang에서 가장 일반적인 연산 중 하나는 패턴 일치입니다. 이것은 변수에 값을 할당 할 때 사용되며, 함수 선언과 case
와 receive
문과 같은 제어 흐름 구조에 사용 receive
. 패턴 매칭 작업은 패턴과 패턴이 매치되는 것에 대한 용어의 적어도 두 부분을 필요로합니다.
erlang의 변수 할당은 다음과 같습니다 :
X = 2.
대부분의 프로그래밍 언어에서이 작업의 의미는 간단합니다. 원하는 이름 (이 경우 X
)에 값 ( 2
)을 바인딩합니다. Erlang은 약간 다른 접근법을 가지고 있습니다 : 왼쪽 ( X
)의 패턴을 오른쪽 ( 2
)의 용어와 일치시킵니다. 이 경우 효과는 동일합니다. 변수 X
가 이제 값 2
바인딩됩니다. 그러나 패턴 매칭을 사용하면 더 많은 구조화 된 할당을 수행 할 수 있습니다.
{Type, Meta, Doc} = {document, {author, "Alice"}, {text, "Lorem Ipsum"}}.
이 일치 연산은 오른쪽 항의 구조를 분석하고 왼쪽의 모든 변수를 해당 항의 적절한 값에 적용하여 왼쪽이 오른쪽과 같도록 수행됩니다. 이 예에서 Type
은 term : 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 ..."}