[erlang] 순차 프로그래밍

2015. 12. 16. 03:09프로그래밍/ETC

728x90
728x90

작성 소스

https://github.com/ElementalKiss/Erlang/tree/master/example


모듈

모듈은 얼랭에서 코드의 기본 단위. 확장자는 .erl인 파일에 저장된다.


코드가 실행되기 위해선 컴파일을 해야 한다. 컴파일 된 모듈은 .beam 확장자를 가진다.


간단한 모듈 만들어보기


geometry.erl

1
2
3
4
5
6
7
8
9
10
-module(geometry).
-export([area/1]).
% area 함수는 2개의 절로 구분된다.
% 함수는 여러개의 절로 될 수 있으며 ;로 구분하고
% 마지막 절은 .으로 마친다.
 
% 일반적인 모양 : funcationName ({pattern}) -> statement
 
area({rectangle, Width, Ht}) -> Width*Ht;
area({circle, R}) -> 3.14*R*R.
cs





shop.erl, shop1.erl

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
shop.erl
 
-module(shop).
-export([cost/1]).
 
% shopping list
cost(orange) -> 5;
cost(newspaper) -> 8;
cost(apples) -> 2;
cost(pears) -> 9;
cost(milk) -> 7.
 
shop1.erl
 
-module(shop1).
-export([total/1]).
 
total([{What, N}|T]) -> shop:cost(What) * N + total(T);
total([]) -> 0.
 
% 예시 shop1:total([{pears, 6}, {milk, 3}]).
% 첫 번째 절에서 What |-> pears로 T |-> {[milk,3]}으로 매치된다.
% 식은 show:cost(pears) * 6 + total([{milk, 3}])으로
% 되므로 순차적으로 계산된다.
cs







장점

C나 C++보다는 확장성이 좋다.

코드가 간결하고 관련 코드가 한 곳으로 집중된다.


export(Name/N) 알아보기

Name이란 이름의 함수로 N개의 인자를 가진다는 의미. N을 함수의 애리티(arity)라고 부른다.


1
2
3
4
5
6
7
8
9
10
11
12
13
-module(geometryEX).
-export([area/1]).
% area 함수는 2개의 절로 구분된다.
% 함수는 여러개의 절로 될 수 있으며 ;로 구분하고
% 마지막 절은 .으로 마친다.
 
% 일반적인 모양 : funcationName ({pattern}) -> statement
 
area({rectangle, Width, Ht}) -> Width*Ht;
area({circle, R}) -> 3.14*R*R;
area({square, X}) -> X*X.
 
% 확장이 용이하다.
cs



이름이 같고 애리티가 다른 함수(오버로딩?)


1
2
3
4
5
6
7
8
9
10
11
-module(lib_misc).
-export([sum/1, sum/2]).
 
% 관례적으로 얼랭 프로그래머들은
% 동일한 이름에 애리티가 다른 함수를 보조(auxiliary)함수로 사용한다.
sum(L) -> sum(L, 0).
 
sum([], N) -> N;
sum([H|T], N) -> sum(T, H+N).
 
% sum(L)은 sum/2의 보조 루틴을 사용한다.
cs






펀(fun)

익명(anonymous) 함수. 


간단한 예시




펀의 장점

- 함수의 인수로 사용할 수 있고, 함수가 펀을 반환할 수 있다.

- 함수를 인자로 받거나, 반환하는 함수를 가르켜 고차 함수(higher-order function)이라고 부른다.


필자의 말 - 고차원 함수는 함수형 프로그래밍 언어의 정수(essence)다. 코드의 복부에 대고 불을 뿜는 용이다.


펀을 인수로 갖는 함수.

표준 라이브러리에 있는 lists 모듈은 인수가 펀인 함수를 여럿 익스포트 한다.


엄청 유용한 lists:map(F, L) 예시




다음으로 유용한 lists:filter(P, L) 예시





펀을 반환하는 함수.(사용은 드문 편)

Double을 일반화하여 다른 배수 함수를 만드는 예시





fun(X) -> X*Times end 바깥의 Mult에서 가져오는 Times를 인수로 가져온다.

반환 값 자체는 Mult(3) 자체는 펀을 리턴하게 되고 그 리턴을 Triple이 받아 3배 하는 함수를 정의할 수 있다.


리스트처리

sum과 map 구현해보기.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
-module(mylists).
-export([sum/1, map/2]).
 
sum([H|T]) -> H+sum(T); % 1
sum([]) -> 0.           % 2
 
% sum([1,3,10]) 과정
1 + sum([3,10]) 1에 의해 실행
1 + 3 + sum([10]) 1에 의해 실행
1 + 3 + 10 + sum([]) 1에 의해 실행
1 + 3 + 10 + 0 2에 의해 실행
 
map(_, []) -> [];
map(F, [H|T]) -> [F(H)|map(F,T)].
cs




리스트 해석

list comprehension은 펀, 맵, 필터를 사용하지 않고 리스트를 생성하는 식.

프로그램을 더 짧고 이해하기 쉽게 만든다.


리스트 생성하는 방법들.





표기법 [F(X) || X <- L]의 의미

리스트 L로부터 X를 받는 리스트 F(X)라는 의미.



산술식




가드

패턴 매칭의 능력을 증가시키는 데 사용할 수 있는 구조.


X와 Y의 최대값을 계산하는 max(X, Y) 함수 작성 예시


max(X, Y) when X > Y -> X;

max(X, Y) -> Y.


첫 번째 절이 매치하지 않으면, 두 번째 절을 시도한다.


가드가 식으로 사용 될 경우 애텀 true 또는 false 중 하나로 평가된다.


가드 시퀀스

하나의 가드 혹은 세미콜론(;)으로 구분된 일련의 가드'들'

Guard1, Guard2, ... , GuardN의 형태로 표현한다.

쉼표(,)로 구분되고 모든 가드가 참으로 평가되어야 true로 평가된다.


is_tuple(T), size(T) =:= 6, abs(element(3, T)) > 5 등

다양한 방식으로 가드를 붙여서 사용할 수 있다.





True 가드 사용하기.

C 언어의 case의 default나 if문의 else와 활용도가 유사.


레코드

튜플의 요소 수가 커지는 경우 문제가 생길 수 있다.
튜플 안의 특정 요소와 이름을 연관 짓는 방법을 제공하는데 이것이 레코드.

예시

1
-record(todo, {status=reminder, who=elkiss, text}).
cs


record.hrl 파일로 위와같이 만든다. 할일 리스트!

rr 명령을 통해 hrl 파일을 부른다.

#[레코드명] 명령으로 레코드를 생성하고 갱신할 수 있다.





레코드는 변장한 튜플일 뿐이다.

rf([레코드명])을 통해 다시 튜플로 바꿔 사용할 수 있다.





case, if


case

1
2
3
4
5
case Expression of
    Pattern1 [when Guard1] -> Expr_seq1;    
    Pattern2 [when Guard2] -> Expr_seq2;
    ...
end
cs


if

1
2
3
4
5
6
7
8
9
if
    Guard1 ->
        Expr_seq1;
    Guard2 ->
        Expr_seq2;
    ...
    true ->
        Expr
end
cs



728x90
반응형

'프로그래밍 > ETC' 카테고리의 다른 글

[디버깅] 조건 디버깅(VS2015)  (3) 2016.01.02
[디버깅] 메모리 디버깅(VS2015)  (0) 2016.01.02
[erlang] 예외  (2) 2015.12.23
MySql 연결하기  (2) 2015.08.27
딱딱한 페이지 그만(작성중)  (2) 2015.08.24
슈퍼 글로벌 변수  (1) 2015.08.07
Unity - PHP 연결  (2) 2015.07.28