erlang 2장
- 프로그래밍 언어/erlang
- 2022. 9. 6.
반응형
변수 설정
# 이거 안됨
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 |