Languages/Erlang2008.09.01 17:07
앞선 글에서 Erlang의 타입 시스템이 C와 같은 프로그래밍 언어와 어떻게 다른지에 대한 이야기를 잠깐 했습니다. 아톰, 리스트, 투플 같은 낯선 언어 구조물들에 대한 언급도 잠깐 했었구요.

이번 글에서는 그 '낯선 구조물들'에 대한 설명을 조금 해 보려고 합니다. 먼저 아톰입니다.

Erlang에서 아톰은 소문자로 시작하는 이름입니다. 이름이라고는 하지만 그에 대응하는 값을 갖는 것은 아니고, 그 자체로 의미가 있습니다. Ruby라는 프로그래밍 언어에 익숙한 분이라면 아마 심볼(symbol)이라는 개념을 아실텐데요. Ruby에서 심볼은 다음과 같은 형태를 가집니다.

:foo

심볼은 그 자체로 유일합니다. Erlang의 아톰도 마찬가지입니다. C의 매크로 상수같은 것과 비슷한 개념이 아니냐고 물을 분도 계실텐데, #define을 사용해 정의한 매크로 상수들은 '값으로 치환되는 이름'이고 그 이름 자체가 비교의 대상이 될 수는 없기 때문에 같은 개념이라고 볼 수는 없습니다. 이해가 잘 되지 않는다면, 우선은 그냥 '사용자 정의 상수'쯤으로 생각해 버립시다. 그 이름이 곧 그 값인 상수 말이죠.

일례로, Erlang 셸에서 다음과 같이 아톰을 입력해 보면, 아톰 그 자체가 값으로 반환되는 것을 볼 수 있습니다. 별도의 값으로 치환되는 이름이 아니라는 뜻입니다. 아톰이 유용하게 사용되는 사례는 잠시 후 투플에 대해 설명하면서 살펴보도록 하겠습니다.

1> foo.
foo

투플은 C라면 구조체와 비슷한 개념인데, {와 }를 둘러싸 만듭니다. 가령 다음과 같은 C 구조체가 있다고 합시다.

struct Entry {
    int code;
    int value;
};

C에서 이 구조체로 변수를 만들고 그 값을 조작하려면 다음과 같이 하게 될 것입니다.

Entry a;
a.code = 3;
a.value = 12;

앞서도 말했지만 Erlang에는 '정적으로 변수에 타입을 준다'는 개념이 없기 때문에, 그냥 다음과 같이 합니다.

1> P = { 3, 12 }.

그런데 이렇게 하면 이 투플이 대체 무슨 투플인지 알 길이 전혀 없다는 문제가 있습니다. 그러므로 보통은 다음과 같이 하는 쪽을 선호합니다.

1> P = { entry, {code, 3}, {value, 12} }.

아톰을 통해 각각의 정보 단위에 이름을 주었다는 점을 유의해서 봅시다. 이렇게 하면 뭔가 잘 정의된 의미 구조를 갖는 투플을 만들고 사용할 수 있습니다. 그런데 대체 저 투플 안에 저장된 값을 뽑아낼때는 대체 어떻게 해야 하나요? -_-;;

앞선 글에서 = 연산자가 사실은 '대응 연산자'라고 말씀드렸던 것을 상기합시다. 값을 뽑아내려면, 이 연산자를 가지고 대응 규칙을 정의하면 됩니다. 다음을 보시죠. 붉은 색으로 표시한 부분은 아직 사용된 적이 없는 변수들이라는 점을 유의해 보십시다.

2> {entry, CodeTuple, ValueTuple} = P.
{entry,{code,3},{value,12}}
3> CodeTuple.
{code,3}
4> ValueTuple.
{value,12}

대응 연산자를 사용해 대응 규칙을 정의하고 있습니다. 대응 규칙이라는 좀 무시무시한 용어를 쓰긴 했습니다만, 사실 대층 규칙이라는 것은 별게 아닙니다. = 연산자 오른쪽에 오는 투플의 각 요소가 = 연산자 왼쪽에 오는 투플의 각 요소들에 어떻게 대응되는지를 명시하는 것에 불과합니다. 그 결과, CodeTuple은 {code, 3}에 대응되었고, ValueTuple은 {value, 12}에 대응되었습니다. 이런 식으로 하면 복잡한 투플 내의 임의 위치에 있는 값을 알아낼 수 있게 됩니다. 이 규칙을 조금 응용하면, 다음과 같이 해도 되겠군요.

5> {entry, {code, X}, {value, Y}} = P.
{entry,{code,3},{value,12}}
6> X.
3
7> Y.
12

이 예제들을 통해 아톰, 투플, 그리고 변수의 사용에 대해 약간의 감을 잡으셨을 수 있으리라 생각됩니다.

말씀드리는 김에 조금 더 나가볼까요? 대응 관계가 만들어진 변수를 통상 바운드(bound)된 변수라고 부릅니다. 그럼 언바운드 변수라는 것도 있나요? 네. 있긴 합니다. 언바운드 변수는 대응 규칙을 좀 더 느슨하게 만들고자 할 때 사용합니다. 다음 예제를 보시죠.

8> {_, {_, A}, {_, B}} = P.
{entry,{code,3},{value,12}}
9> A.
3
10> B.
12

언바운드 변수 '_'를 사용해서 대응 규칙을 만들면 투플의 구조만 일치하면 그 특정 위치에 오는 값을 뽑아낼 수 있습니다. (뽑아낼 수 있는 값에는 제한이 없습니다. 아톰이 될 수도 있고, 투플이 될 수도 있고, 리스트가 될 수도 있겠죠.)

그럼 이제 마지막으로 리스트에 대해서 말씀드리고 이번 글은 맺겠습니다. 리스트는 '['와 ',' 그리고 ']'를 가지고 만드는, 일련의 값의 묶음입니다. 묶이는 대상은 일반 값이 될 수도 있고, 투플이나 아톰이 될 수도 있고, 또다른 리스트가 될 수도 있습니다. 하나의 리스트 안에는 서로 다른 타입의 값들이 어떤 순서로도 저장될 수 있습니다.

11> L = [2, CodeTuple, ValueTuple, X, Y].
[2,{code,3},{value,12},3,12]

가령 지금까지의 예제들을 충실하게 실행한 상태에서 위와 같이 하면, 보시다시피 [2,{code,3},{value,12},3,12]의 리스트가 만들어지게 되죠.

[다음 글에서 계속...]




신고
Posted by 이병준

소중한 의견, 감사합니다. ^^

  1. <A href="http://blueandyellow.blog22.fc2.com/">SEX</A>できるサイト<A href="http://pyridoxiamine.blog34.fc2.com/">逆援助</A>専門の出会い<A href="http://gyakuenjyoyattemita.blog10.fc2.com/">逆援助</A>でセレブ女性とH<A href="http://douteiget.blog102.fc2.com/">童貞</A>喪失も可能<A href="http://hurinxxx.blog19.fc2.com/">不倫</A>

    2009.02.28 10:46 신고 [ ADDR : EDIT/ DEL : REPLY ]