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 |