StatCounter - Free Web Tracker and Counter

erlang 2장

반응형

변수 설정

# 이거 안됨
a=1.

## 이건 됨
Abc = 1.
ABC = 2.
  • erlang의 모든 변수는 대문자로 시작해야한다. 
  • 변수
    • erlang에서 변수는 단일 할당 변수다.
    • 변수는 두 가지 상태를 가짐
      • UnBound : 아직 값을 가지지 않음. "=" 연산자는 할당 연산자처럼 동작.
      • Bound : 값을 가짐. "=" 연산자는 패턴 연산자로 동작.
  • erlang에서 변수는 어떤 값에 대한 참조다.
    • Bound 된 변수는 그 값을 담은 저장소 영역에 대한 포인터로 표현된다.
  • erlang의 변수에는 atom도 할당이 가능하다.

 

익명 변수

_ : 익명변수

# 사용법
{_,{_,{_,{_,Who},_},_} = Person.
  • "_"는 익명변수로 사용된다.
  • 익명변수는 동일한 패턴에서 여러 번 나오더라도 같은 값으로 바인드 될 필요가 없다.

 

 

 

패턴 매칭

# 변수 바인딩
X = 2+3.
Y = 10.

# 패턴 매칭
X = Y.
  • erlang에서 "="는 패턴 매칭 연산자를 의미한다.
  • L=R은 R을 계산한 결과가 L과 패턴 매칭이 되는지를 확인하는 작업이다.

 

부동 소수점

# 부동 소수점 연산
4/2.

# 나머지 연산
4 rem 2.

# 몫 연산
4 mod 2.

각각 다른 연산을 사용한다. 

 

Atom

red
december
cat
joe@somehost

# atom은 atom 그 자체로 불변하는 상수다. (이름 같은 것)
hello.
> hello
  • 불변값을 의미한다.
  • atom은 전역에서 사용할 수 있다. 
  • atom은 소문자로 시작하고, 뒷쪽에는 소문자 / _ / @가 올 수 있다. 
  • 원자이며 변수가 아니고, 그냥 이름으로 이해하면 된다.

 

튜플

# 튜플의 형태
P = {10, 45}

# 프로그램의 이해를 돕는다.
P = {point, 10, 45}

# 튜플 안의 튜플을 사용할 수 있음.
Person = {person, 
		{name, joe},
            {height, 1.82},
            {footsize, 42},
            {eyecolor, brown}}.
  • 튜플은 여러 자료 형을 가질 수 있음. 
  • 값이 더 추가되지 않을 때, 튜플을 사용하면 된다.
  • 튜플은 선언할 때 자동으로 생성되고, 더는 사용되지 않을 때 제거된다. 
  • erlang은 GC를 이용해서 사용하지 않는 모든 메모리를 제거해주기 때문이다. 
F = {firstName, joe}.
{firstName,joe}

L = {lastName, armstrong}.
{lastName,armstrong}

%% 튜플 안에 튜플이 들어가면 참조된다.
P = {person, F, L}.
{person,
	{firstName,joe},
	{lastName,armstrong}}
  • 튜플 안에 튜플이 들어가게 되면, 튜플 변수를 참조한다.

 

튜플에서 값 추출하기

# 튜플 변수
Person = {person, {name,{first,joe},{last,armstrong}},{footsize,42}}.

# 익명 변수를 이용해서 추출
{_,{_,{_,Who},_},_}.


Who.
>> joe
  • 기본적으로 erlang은 패턴 매칭을 이용한다.
  • 따라서 "="을 이용하면 튜플과 튜플 간의 패턴 매칭을 통해서 값을 추출할 수 있다. 

 

리스트

# 리스트는 [] 형태가 됨.
ThingsToBuy = [{apples,10}, {pears,6}, {milk,3}].
MyList = [].
  • 리스트는 가변적인 것을 저장할 때, 리스트를 사용한다.
  • 리스트는 "[]"를 이용해서 선언한다.

 

List의 Head / Tail

# 기본 리스트
MyList = [1,2,3,4]

# Head / Tail 연산
[Head | Tail] = MyList

# 여러 형태로 Head를 넣을 수 있음.
[AA | AAA | Tail] = MyList
>> AA = 1 / AAA = 2 / Tail = [3,4]
  • Head : 리스트의 가장 첫번째 요소
  • Tail : Head를 제외한 나머지
  • Head 연산은 굉장히 효율적이다. 따라서 모든 리스트 처리 함수가 리스트의 Head를 추출하고, 꼬리를 처리하는 식으로 접근한다. 
  • [H | T]를 했을 때, T가 List가 아닌 경우 문제가 발생한다. 

 

List에서 요소 추출하기

ThingsToBuy1 = [{orange,4}, {newspaper,1}, {apples,10}, {pears,6}, {milk,3}]

# orange 추출 완료
[Buy1 | ThingsToBuy2] = ThingsToBuy.

# newspaper / appels 추출 완료
[Buy2, Buy3 | ThingsToBuy3] = ThingsToBuy2.
  • 리스트에서 특정 요소를 Head / Tail 방식으로 추출한다.

 

 

문자열

# 출력 가능한 문자들을 나타내는 정수가 없음
[1,2,3].
>> [1,2,3]

# 모든 정수가 출력 가능한 문자들을 나타내는 정수임.
[83,117,114,112,114,105,116,101].
>>> "Surprise"

# 1이 출력 가능한 문자가 아님.
[1,83,117,114,112,114,105,116,101].
>> [1,83,117,114,112,114,105,116,101].
  • erlang에는 기본적으로 문자열이 존재하지 않는다.
  • "Hello"는 개별 문자를 표현하는 Char의 리스트의 축약형으로 이해할 수 있다.
  • 리스트에 출력 가능한 정수만 있는 경우, 리스트는 쉘에서 '문자열'을 출력한다.
    • 출력 가능하지 않은 정수가 하나라도 있는 경우, 리스트는 숫자만 그대로 출력한다.

 

 

패턴 매칭 예시

{X,abc} = {123,abc} --> O
{X,Y,Z} = {222,def,"cat"} --> O
{X,Y} = {333.ghi,"cat"} --> X
X = true --> O
{X,Y,X} = {{abc,12},42,{abc,12}} --> O
{X,Y,X} = {{abc,12},42,true} --> X (X는 같은 곳에 패턴 매칭 되어야함)

'프로그래밍 언어 > erlang' 카테고리의 다른 글

erlang : 오류 및 프로세스  (0) 2022.10.12
erlang : 재귀  (0) 2022.09.24
erlang 9장 : 병행 프로그램과 오류  (1) 2022.09.21
erlang 8장 : 병행 프로그래밍  (1) 2022.09.19
erlang 3장  (0) 2022.09.17

댓글

Designed by JB FACTORY