2015. 12. 16. 03:09ㆍ프로그래밍/ETC
작성 소스
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 |
'프로그래밍 > 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 |