1. 부동 소수점 연산
/ 나눗셈 연산자의 결과는 항상 부동소수점 형태로 나온다. 따라서 정수형 나눗셈을 하고자 하면 div 연산자를 이용해야 한다. 이것은 정수형 나눗셈의 몫을 구한다. 한편 rem 연산자는 정수형 나눗셈의 나머지를 구한다.
부동 소수점을 표현하기 위해서는 반드시 소수점을 찍어줘야 한다. 이때 5.0 같은 수를 표현할 때는 반드시 .0까지 확실히 써줄 것. 문장의 마직막을 뜻하는 마침표(.)와 소수점 표현을 혼동하지 않도록 하자.
2. 애텀(Atom)
애텀은 일종의 기호 상수이다. C의 #define 상수나 C++에서의 enum 같은 걸 떠올리면 된다. 하지만 얼랭에서 애텀의 값은 그냥 애텀일 뿐. 애텀이 어떤 수치나 다른 상수값을 대신하지는 않는다.
애텀은 전역(global)으로 선언되며, 반드시 소문자로 시작하고, 그 뒤에는 _ 나 @ 기호가 올 수 있다. 이런 제약이 부담스럽다면 그냥 따옴표(' ')로 묶어도 된다. 따옴표 안에서는 어떤 문자라도 쓸 수 있다. (혹시라도 따옴표 안의 있는 것을 문자열 상수로 착각하지는 말자.)
3. 튜플(Tuple)
튜플은 여러개의 데이터를 하나로 그룹핑한 것으로, C의 구조체(struct)와 비슷하다고 할 수 있다. 단 구조체와는 달리 타입 선언도 없고 변수명도 없이, 단지 중관호 { } 안에 값을 열거하기만 하면 된다.
자, 그럼 이번에는 튜플에서 값을 꺼내와 보기로 하자. 이것도 생각외로 간단하게 할 수 있다.
지난 시간의 패턴 매칭을 기억해 보자. 우변에 있는 것은 튜플이 담긴 변수인데, 이 변수가 튜플 형식이므로 좌변에 오는 형식도 마찬가지로 튜플 형식을 취하면 된다. 좌변에 있는 밑줄(_) 기호는 익명 변수를 뜻한다. 우변의 패턴에 일일이 맞춰서 네이밍을 할 필요없이, 원하는 부분의 데이터만 가져오고자 할 경우에 유용하게 쓸 수 있다. 간단히 생각하면, 그냥 자리만 채워주는 녀석이라고 보면 되겠다.
1> 5/3.
1.6666666666666667
2> 5 div 3.
1
3> 5 rem 3.
2
4> 5.0 * 3.141592.
15.70796
5>
1.6666666666666667
2> 5 div 3.
1
3> 5 rem 3.
2
4> 5.0 * 3.141592.
15.70796
5>
/ 나눗셈 연산자의 결과는 항상 부동소수점 형태로 나온다. 따라서 정수형 나눗셈을 하고자 하면 div 연산자를 이용해야 한다. 이것은 정수형 나눗셈의 몫을 구한다. 한편 rem 연산자는 정수형 나눗셈의 나머지를 구한다.
부동 소수점을 표현하기 위해서는 반드시 소수점을 찍어줘야 한다. 이때 5.0 같은 수를 표현할 때는 반드시 .0까지 확실히 써줄 것. 문장의 마직막을 뜻하는 마침표(.)와 소수점 표현을 혼동하지 않도록 하자.
2. 애텀(Atom)
애텀은 일종의 기호 상수이다. C의 #define 상수나 C++에서의 enum 같은 걸 떠올리면 된다. 하지만 얼랭에서 애텀의 값은 그냥 애텀일 뿐. 애텀이 어떤 수치나 다른 상수값을 대신하지는 않는다.
애텀은 전역(global)으로 선언되며, 반드시 소문자로 시작하고, 그 뒤에는 _ 나 @ 기호가 올 수 있다. 이런 제약이 부담스럽다면 그냥 따옴표(' ')로 묶어도 된다. 따옴표 안에서는 어떤 문자라도 쓸 수 있다. (혹시라도 따옴표 안의 있는 것을 문자열 상수로 착각하지는 말자.)
1> Color = blue.
blue
2> Today = monday.
monday
3> Blog = 'Sizuha.egloos.com'.
Sizuha.egloos.com
4> CV = rei_kugimiya.
rei_kugimiya
5> Shana = melonpan.
melonpan
6>
blue
2> Today = monday.
monday
3> Blog = 'Sizuha.egloos.com'.
Sizuha.egloos.com
4> CV = rei_kugimiya.
rei_kugimiya
5> Shana = melonpan.
melonpan
6>
3. 튜플(Tuple)
튜플은 여러개의 데이터를 하나로 그룹핑한 것으로, C의 구조체(struct)와 비슷하다고 할 수 있다. 단 구조체와는 달리 타입 선언도 없고 변수명도 없이, 단지 중관호 { } 안에 값을 열거하기만 하면 된다.
예를들어. 다음과 같은 구조체를...튜플 내에서는 다시 튜플을 중첩해서 가질 수도 있다. 또한 변수도 튜플의 값이 될 수 있지만, 반드시 값이 정의된 변수여야만 함.
struct Point { int x, y; };
Point P;
P.x = 16; P.y = 32;
얼랭에서 표현한다고 하면,
P = {16, 32}.
이것을 좀 더 읽기 쉽게 표현하기 위해, 튜플의 첫번째 값에 애텀(Atom)을 넣을 수 있다.
P = {point, 16, 32}.
이때의 point 애텀은 값으로써의 의미는 없지만, 단지 알아보기 쉽게 해주는 장식(태깅)이다.
1> Honoka = {profile,
1> {name, shiga_honoka},
1> {age, 16},
1> {blood, 'A'},
1> {height, 150}}.
{profile,{name,shiga_honoka},
{age,16},
{blood,'A'},
{height,150}}
2> ZeroFrameStaff = {staff,
2> {person, Honoka},
2> {level, 1},
2> {class, 'Character Designer'}}.
{staff,{person,{profile,{name,shiga_honoka},
{age,16},
{blood,'A'},
{height,150}}},
{level,1},
{class,'Character Designer'}}
3>
1> {name, shiga_honoka},
1> {age, 16},
1> {blood, 'A'},
1> {height, 150}}.
{profile,{name,shiga_honoka},
{age,16},
{blood,'A'},
{height,150}}
2> ZeroFrameStaff = {staff,
2> {person, Honoka},
2> {level, 1},
2> {class, 'Character Designer'}}.
{staff,{person,{profile,{name,shiga_honoka},
{age,16},
{blood,'A'},
{height,150}}},
{level,1},
{class,'Character Designer'}}
3>
자, 그럼 이번에는 튜플에서 값을 꺼내와 보기로 하자. 이것도 생각외로 간단하게 할 수 있다.
3> {profile, {name, Name}, {_, Age}, _, _} = Honoka.
{profile,{name,shiga_honoka},
{age,16},
{blood,'A'},
{height,150}}
4> Name.
shiga_honoka
5> Age.
16
6>
{profile,{name,shiga_honoka},
{age,16},
{blood,'A'},
{height,150}}
4> Name.
shiga_honoka
5> Age.
16
6>
지난 시간의 패턴 매칭을 기억해 보자. 우변에 있는 것은 튜플이 담긴 변수인데, 이 변수가 튜플 형식이므로 좌변에 오는 형식도 마찬가지로 튜플 형식을 취하면 된다. 좌변에 있는 밑줄(_) 기호는 익명 변수를 뜻한다. 우변의 패턴에 일일이 맞춰서 네이밍을 할 필요없이, 원하는 부분의 데이터만 가져오고자 할 경우에 유용하게 쓸 수 있다. 간단히 생각하면, 그냥 자리만 채워주는 녀석이라고 보면 되겠다.




덧글
RDB에서 카디널리티의 한 행을 tuple이라고 부르는 것도 비슷한 개념인 건가요.^_^
다만 굳이 mod라는 표현이 필요하다면, 함수로 구현할 수는 있겠죠.
mod 는 modulo : 법(modulus)을 이용하다는 의미로서,
mod n 의 경우 "n 을 법으로 하는 합동"을 의미하는 표현으로부터 파생된것 같습니다.
따라서, 엄밀하게는 나눗셈의 나머지가 아니라, 대수구조 자체가 다른 상황이 되죠..
수학에서의 정의를 엄밀히 따르자면 mod 보다는 rem 이 당연하게 여겨지네요.
이 무슨 우연의 일치입니까...