얼랭 설치하기

Ubuntu의 경우..

sudo apt-get install erlang

 

셸 시작하기

터미널 창에서 erl 이라고 입력하고 얼랭을 시작하자.

$ erl

jonathan@jonathan-laptop:~$ erl
Erlang R13B03 (erts-5.7.4) [source] [smp:4:4] [rq:4] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.7.4  (abort with ^G)
1> 20 + 30.
50
2>

 

간단한 정수 연산

jonathan@jonathan-laptop:~$ erl
Erlang R13B03 (erts-5.7.4) [source] [smp:4:4] [rq:4] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.7.4  (abort with ^G)
1> 2 + 3 * 4.
14
2> (2 + 3) * 4.
20
3> 123456789 * 987654321 * 112233445566778899 * 998877665544332211.
13669560260321809985966198898925761696613427909935341
4> 16#cafe * 32#sugar.
1577682511434
5>

 

변수

어떤 명령의 결과를 저장하여 나중에 사용하려면 어떻게 할까? 그게 바로 변수의 역할이다.

1> X = 123456789.
123456789

– 모든 변수는 대문자로 시작해야 한다.

어떤 변수의 값을 보려면, 그냥 그 변수명을 입력하면 된다.

2> X.
123456789

만약, 변수 X 에 다른 값을 할당하려 한다면 오류 메시지를 발견할 것이다.

1> X = 1234567.
1234567
2> X = 890.
** exception error: no match of right hand side value 890

이는 다음의 이유에서 발생하는 오류이다.
– 첫째, X는 변수가 아니다. 적어도 자바나 C 같은 언어에서 쓰는 의미의 변수로 생각해서는 안된다.
– 둘째, = 은 할당 연산자가 아니다.

 

뭔가 잘못되어 시스템이 응답이 없다면, 그냥 Ctrl+C 를 누르자.

BREAK: (a)bort (c)ontinue (p)roc info (i)nfo (l)oaded
(v)ersion (k)ill (D)b-tables (d)istribution

와 같이 나타날 것이다.
A를 누르면 얼랭 세션을 중단할 수 있다.

 

뜻하지 않는 변수

얼랭은 ‘단일 할당 변수(single assignment variable)’를 가진다. 그 이름이 의미하는 듯, 단일 할당 변수는 값을 오직 한 번만 받을 수 있다. 일단 한번 설정된 변수의 값을 변경하려고 하면 오류가 발생한다.

값이 할당된 변수를 ‘바운드(bound)’ 변수라 부르며, 그렇지 않은 변수는 ‘언바운드(unbound)’ 변수라 부른다. 모든 변수는 언바운드에서 시작한다. 그러나 일단 값을 담으면, 영원히 그 값을 보유한다.

변수의 범위(scope)란 그 변수가 정의된 어휘 단위(lexical unit)를 말한다. 따라서 만약 X가 어떤 단일 함수 절 내에서 사용되면, 그 변수의 값은 절 밖으로 나가지 못한다. 동일한 함수에서 여러 다른 절들이 공유하는 그런 전역(global) 또는 프라이빗(private) 변수 같은 것은 없다.

 

패턴 매칭

대부분의 언어에서 =은 할당문을 나타낸다. 그러나 얼랭에서 =는 패턴 매칭 연산을 뜻한다. Lhs = Rhs 가 진짜로 의미하는 바는 오른쪽(Rhs)를 계산한 다음, 그 결과를 왼쪽(Lhs)에 있는 패턴과 매치하라는 뜻이다.

 

부동 소수점 수

부동 소수점 수는 소수점에 이어 적어도 하나의 소수가 와야 한다. 정수 두 개를 ‘/’로 나누면 그 결과는 자동으로 부동 소수점 수로 변환된다.

 

애텀

얼랭에서 애텀(Atom)은 수치가 아닌 상이한 불변 값을 나타내는 데 사용한다.

얼랭에서 애텀은 전역(global)이며, 또한 매크로 정의나 인클루드 파일을 사용하지 않고도 그 목적을 달성할 수 있다.
애텀은 소문자로 시작하고 그 뒤로 일련의 알파뉴머릭(alphanumeric)문자나 언더스코어(_) 또는 at(@) 기호가 온다.

애텀은 작은 따옴표(‘ ‘)로 묶을 수 있다. 인용 부호 형태를 사용하면 대문자로 시작하는 애텀(그러지 않으면 변수로 해석되었을 것이다)이나 또는 알파뉴머릭이 아닌 문자가 들어간 애텀을 만들 수 있다. 예를 들면, ‘Monday’, ‘Tuesday’, ‘+’, ‘*’, ‘an atom with spaces’ 와 같은 것들이다. 인용부호를 사용할 필요가 없는 애텀들도 묶을 수 있으며, 따라서 ‘a’는 a 와 정확히 똑같다.

애텀의 값은 애텀일 뿐이다. 그저 애텀인 명령을 주면 얼랭 셸은 그 애텀의 값을 출력할 것이다.

15> hi.
hi

애텀의 값 또는 정수의 값이라는 말이 다소 이상해 보일 수도 있다. 그렇지만 얼랭이 함수형 언어인 까닭에, 모든 식은 값을 가져야 한다. 아주 간단한 식인 정수와 애텀도 예외는 아니다.

 

 튜플

정해진 수의 항목을 하나의 개체로 그룹핑한다고 해보자. 이럴 때 튜플(Tuple)을 사용한다. 튜플은 여러분이 표현하고자 하는 값들을 중괄호로 둘러싸고 쉼표로 그 값들을 구분하면 된다.

튜플은 C의 구조체와 유사하다. 다른 점이라면 튜플은 익명이라는 것이다. 얼랭에는 형 선언이 없기 때문에, ‘점(point)’를 만들 때는 다음과 같이 작성하면 된다.

16> T = {10, 45}.
{10,45}
17> T .
{10,45}

이러면 튜플을 하나 생성하여 그것을 변수 P와 묶는다. 튜플의 필드는 이름이 없다. 튜플 그 자체는 그저 정수 한 쌍만 들어 있을 뿐이므로, 그게 어떤 용도로 사용되는지는 우리가 기억해야 한다. 튜플이 어디에 사용되는지 기억하기 쉽도록 하려고, 통상 튜플의 첫 번째 요소로 그 튜플이 무엇인지를 나타내는 애텀을 사용한다. 또한 튜플은 중첩될 수 있다.

 

튜플 생성하기

튜플은 선언할 때 자동으로 생성되고 더는 사용되지 않을 때 제거된다. 얼랭은 가비지 콜렉터(garbage collector)를 사용하여 사용되지 않는 모든 메모리를 수거하기 때문에 우리가 메모리 할당에 대해서 걱정할 필요는 없다.

새 튜플을 구성할 때 변수를 사용하면, 그 새 튜플은 변수가 참조하는 데이터 구조의 값을 공유할 것이다.

2> F = {firstName, jonathan}.
{firstName,jonathan}
3> L = {lastName, kim}.
{lastName,kim}
4> P = {person, F, L}.
{person,{firstName,jonathan},{lastName,kim}}

만약 정의되지 않은 변수로 데이터 구조를 생성하려 하면 오류가 날 것이다.

 

 튜플에서 값 추출하기

마치 할당문처럼 보이는 ‘=’는 얼랭에서는 할당문이 아니라 패턴 매칭 연산자이다. 사실, 패턴 매칭은 얼랭의 근본이며 많은 다양한 작업에서 사용된다. 패턴 매칭은 데이터 구조에서 값을 추출해내는 데도 사용되고, 함수 속의 제어 흐름이나, 병렬 프로그램에서 어떤 프로세스로 메시지를 보낼 때 어느 메시지가 처리되어야 하는지를 정하는 데도 사용된다.

튜플에서 어떤 값을 추출하려면, 패턴 매칭 연산자 ‘=’을 사용한다.

5> Point = {point, 10, 45}.
{point,10,45}
6> {point, X, Y} = Point.
{point,10,45}
7> X.
10
8> Y.
45

위의 예에서와 같이, 등호 표시의 양쪽에 있는 튜플은 요소의 개수가 같아야 하며, 양측의 대응되는 요소는 같은 값으로 바인드되어야 한다.

복잡한 튜플인 경우, 그 튜플과 똑같은 모양(구조)으로 된 패턴을 하나 만들고 그 패턴 속에서 사용자가 값을 추출하고자 하는 곳에 언바운드 변수를 둠으로써 값을 추출해낼 수 있다.

 

리스트

개수가 가변적인 무엇인가를 저장할 때는 리스트(List)를 사용한다. 리스트는 요소를 대괄호로 둘러싸고 쉼표로 요소들을 구분하여 만든다.

 

 리스트 – 용어

리스트의 첫째 요소를 그 리스트의 ‘헤드(head)’라고 부른다. 리스트에서 헤드를 제거했을 때, 남은 부분을 가리켜 그 리스트의 ‘꼬리(tail)’라고 부른다. 리스트의 헤드는 무엇이든 될 수 있지만, 꼬리는 통상적으로 리스트라는 점에 유의하자.

리스트의 헤드를 액세스하는 것은 매우 효율적인 연산이기 때문에 사실상 모든 리스트 처리 함수가 리스트의 헤드를 추출하는 것에서 시작한다. 리스트의 헤드에 대해 뭔가를 하고, 리스트의 꼬리를 처리하는 식이다.

 

 리스트 – 정의하기

T가 리스트이면, [H|T]도 리스트다. 헤드가 H이고 꼬리가 T인 리스트인 것이다. 세로막대 |는 리스트의 헤드와 꼬리를 구분한다. []는 빈 리스트이다.

[…|T] 생성자를 사용하여 리스트를 만들 때는 T가 리스트임을 보장해야 한다. 그러면 새 리스트는 적절한 형태가 될 것이다. 만약 T가 리스트가 아닐 경우, 그 새로운 리스트는 부적절한 리스트라 부른다. 대부분의 라이브러리 함수들은 리스트가 적절한 형태임을 가정하기 때문에 부적절한 리스트와는 작동하지 않는다.

 

 리스트 – 요소 추출하기

다른 모든 것과 마찬가지로, 리스트에서 요소를 추출하는 데도 패턴 매칭 연산을 사용할 수 있다.비어 있지 않은 리스트 L 이 있다면, 식 [X|Y] = L (이때 X와 Y는 언바운드 변수다)은 리스트의 헤드를 X에 그리고 리스트의 꼬리를 Y로 추출할 것이다.

 

 문자열

엄밀히 말하면, 얼랭에는 문자열이 없다. 문자열(string)은 실제로는 정수의 리스트일 따름이다. 문자열은 큰따옴표(“”)로 둘러싼다.
어떤 프로그래밍 언어에서는 문자열은 작은따옴표 또는 큰따옴표로 묶을 수 있지만 얼랭에서는 큰따옴표를 사용해야 한다.

셸에서 리스트의 값을 출력할 때는 리스트를 문자열로 출력하는데, 그건 오직 그 리스트 속에 있는 모든 정수가 출력 가능한 문자들을 나타내는 경우에 한해서다.

어떤 정수가 어떤 문자를 표현하는지 알 필요는 없다. 알아야 한다면, ‘달러 구문(dollar syntax)’을 사용하면 된다.

 

 문자열에서 사용하는 문자집합

문자열의 문자들은 Latin-1 (ISO-8859-1)문자 코드를 표현한다.

Leave a Reply