'얼랭 패턴매칭'에 해당되는 글 1건
2008. 9. 24. 19:54
지난번 포스트에서 얼랭을 시작해봤다. 그럼 오늘은 얼랭을 시작했으니 이제 얼랭에 대해서 간을 함 봐보자. 여기서 간을 본다 하니무슨 음식도 아니고? 이러는 분들도 있겠지만 나도 그렇고 아직 얼랭의 간도 보기 전이니 그냥 간을 본다고 하자. 왜냐 얼랭을배우면서 이 부분이 아직 이해가 잘 안되는 부분이니깐!^_^;
1. 패턴 매칭
일반적인 언어에서 "="은 할당문을 나타낸다. 그러나 얼랭에서 "="는 패턴매칭 연산을 뜻한다. 언뜻 이해가 되지 않겠지만이전 포스트에서 변수에 한번 할당되면 그 변수의 값은 바뀌지 않는다고 했다. 이것과 연결해서 패턴매칭은 "Lhs = Rhs"이것에서 일반적인 언어에서 Rhs의 값을 Lhs에 대입하라는 것이 아니라 Rhs의 값을 계산한 다음 Lhs의 패턴과 매칭하라는것이다.
아직 이해가 되지 않겠지만, 그냥 그렇다라고 생각하자 아래 예는 패턴 매칭을 설명한다.
즉, 예를 들면 얼랭에서의 "="는 수적적 의미의 "="와 비슷하다. 즉, 좌변과 우변의 결과가 동일하다라는 의미이다.
2. 애텀( Atom )
애텀? Atom? 도대체 애텀이 머야? 얼래에서의 애텀은 수치가 아닌 상이한 불변 값을 나타내는데 사용한다. 이건 또 무슨 말인가? C나 자바에서의 열거형을 생각하면 쉽게 이해가 될 것이다. 이러한 애텀은 전역(global)으로 선언되며, 반드시 소문자로 시작해야 하고 _나 @와 같은 기호가 올수 있고 작은 따옴표로 묶을 수 있다.
이해가 안되시는 분들이 많이 있을 것이다. 사실 나도 잘 이해가 안되니 하지만 저번에도 말했듯이 언젠가는 이해가 되겠지..? 이런 마음으로 계속 진행을 해보자
3. 튜플( Tuple )
튜플? 와 도대체 이넘의 언어는 무슨 이런 말들이 많어? 도대체가 이해가 안되네. 하지만 나도 아직 많이는 보지 않았지만 내가 느낀 얼랭은 수학과 유사하다는 느낌이 많이 든다.( 여기저기 수학 공부를 많이 해야한다는 생각만..ㅜㅜ; 사실 수학하기 싫어서 컴터 전공했는데!ㅠㅠ; 후회 막심 )
머 다시 돌아와서 튜플은 C의 구조체와 유사하며, 다른 점은 형의 선언이나 그런거 없이 데이터의 집합체라고 보면된다. 나는 그냥 집합으로 이해하고 있다. 그런데 이러한 튜플을 코드로 읽거나 이해하기 편하게 첫번째 요소를 해당하는 튜플이 무엇인지를 나타내는 애텀으로 사용한다. 즉 { 10, 25 } 대신 { point, 10, 25 }라고 적는다.
자 그럼 튜플을 생성하고 사용해 보자
4. 리스트
튜플이 다수의 데이터들에 대한 묶음이라면, 리스트는 가변적인 개수의 데이터를 담아두는 집합이라고 생각하면 좀더 편할 것이다. 사실 나도 이렇게 이해하고 있다. 또한 리스트는 대괄호 []로 표현한다.
리스트도 첫번째 요소를 '헤드( head )'라고하고 이후의 나머지를 '꼬리( tail )'라고 부른다. 예를 들어 [1, 2, 3, 4, 5]에서 1이 헤드에 해당하고 나머지 "2, 3, 4, 5"가 꼬리에 해당한다. 머 말이 많아야 머하나 리스트를 생성하고 사용해보자.
자 오늘도 여기까지 하고, 다음에 문자열을 시작으로 다시 시작해보도록 하겠다. 그럼 이 글을 읽는 모든 분들에게 오늘 하루 즐겁고 행복만이 가득하길...
1. 패턴 매칭
일반적인 언어에서 "="은 할당문을 나타낸다. 그러나 얼랭에서 "="는 패턴매칭 연산을 뜻한다. 언뜻 이해가 되지 않겠지만이전 포스트에서 변수에 한번 할당되면 그 변수의 값은 바뀌지 않는다고 했다. 이것과 연결해서 패턴매칭은 "Lhs = Rhs"이것에서 일반적인 언어에서 Rhs의 값을 Lhs에 대입하라는 것이 아니라 Rhs의 값을 계산한 다음 Lhs의 패턴과 매칭하라는것이다.
아직 이해가 되지 않겠지만, 그냥 그렇다라고 생각하자 아래 예는 패턴 매칭을 설명한다.
1> X = ( 2 + 4 ).
6
2> Y = 10.
10
3> X = 6.
6
4> X = Y.
=ERROR ...
위 예에서 보는거와 같이 처음에 X값과 Y값에 각각 6과 10이 바인딩 된 상태이다. 이 상태에서 3번째 라인은 X바인딩된 6과 정수 6의 패턴은 일치하기 때문에 에러가 안나지만, 4번째 라인에서는 X와 Y에 바인딩된 패턴이 일치하지 않기 때문에 에러를 발생시킨다.6
2> Y = 10.
10
3> X = 6.
6
4> X = Y.
=ERROR ...
즉, 예를 들면 얼랭에서의 "="는 수적적 의미의 "="와 비슷하다. 즉, 좌변과 우변의 결과가 동일하다라는 의미이다.
2. 애텀( Atom )
애텀? Atom? 도대체 애텀이 머야? 얼래에서의 애텀은 수치가 아닌 상이한 불변 값을 나타내는데 사용한다. 이건 또 무슨 말인가? C나 자바에서의 열거형을 생각하면 쉽게 이해가 될 것이다. 이러한 애텀은 전역(global)으로 선언되며, 반드시 소문자로 시작해야 하고 _나 @와 같은 기호가 올수 있고 작은 따옴표로 묶을 수 있다.
이해가 안되시는 분들이 많이 있을 것이다. 사실 나도 잘 이해가 안되니 하지만 저번에도 말했듯이 언젠가는 이해가 되겠지..? 이런 마음으로 계속 진행을 해보자
3. 튜플( Tuple )
튜플? 와 도대체 이넘의 언어는 무슨 이런 말들이 많어? 도대체가 이해가 안되네. 하지만 나도 아직 많이는 보지 않았지만 내가 느낀 얼랭은 수학과 유사하다는 느낌이 많이 든다.( 여기저기 수학 공부를 많이 해야한다는 생각만..ㅜㅜ; 사실 수학하기 싫어서 컴터 전공했는데!ㅠㅠ; 후회 막심 )
머 다시 돌아와서 튜플은 C의 구조체와 유사하며, 다른 점은 형의 선언이나 그런거 없이 데이터의 집합체라고 보면된다. 나는 그냥 집합으로 이해하고 있다. 그런데 이러한 튜플을 코드로 읽거나 이해하기 편하게 첫번째 요소를 해당하는 튜플이 무엇인지를 나타내는 애텀으로 사용한다. 즉 { 10, 25 } 대신 { point, 10, 25 }라고 적는다.
자 그럼 튜플을 생성하고 사용해 보자
1> F = { firstName, joe }.
{firstName, joe}
2> L = { lastName, armstrong }.
{lastName, armstrong}
3> Point = { point, 10, 45 }.
{point, 10, 45}
자 이렇게 튜플을 생성했다면 위 튜플을 사용해 보자. {firstName, joe}
2> L = { lastName, armstrong }.
{lastName, armstrong}
3> Point = { point, 10, 45 }.
{point, 10, 45}
4> {point, X, Y} = Point.
{point, 10, 45}
5> X.
10
6> Y.
45
헉, 먼가 이상하지 않은가? 똑봐로 봤다. 튜플에서 어떠한 값을 추출하려면, 패턴 매칭 연산자 "="를 사용해야 한다. 다시 말해서 위의 4번에서 Point에서 point를 추출해서 X, Y에 각각 10과 45를 바운드 시킨다. 이해가 되는가? 나도 사실 여기까지는 잘 안됬다. 하지만 책에서 그랬듯이 그냥 가다보면 이해가 될 것이다. 생각하고 그냥 가보는 수밖에{point, 10, 45}
5> X.
10
6> Y.
45
4. 리스트
튜플이 다수의 데이터들에 대한 묶음이라면, 리스트는 가변적인 개수의 데이터를 담아두는 집합이라고 생각하면 좀더 편할 것이다. 사실 나도 이렇게 이해하고 있다. 또한 리스트는 대괄호 []로 표현한다.
리스트도 첫번째 요소를 '헤드( head )'라고하고 이후의 나머지를 '꼬리( tail )'라고 부른다. 예를 들어 [1, 2, 3, 4, 5]에서 1이 헤드에 해당하고 나머지 "2, 3, 4, 5"가 꼬리에 해당한다. 머 말이 많아야 머하나 리스트를 생성하고 사용해보자.
1> ThingsToBuy = [{apples, 10}, {pears, 6}, {milk, 3}].
[{apples, 10}, {pears, 6}, {milk, 3}]
2> ThingsToBuy1 = [{oranges, 4}, {newspaper, 1}|ThingsToBuy].
[{apples, 10}, {pears, 6}, {milk, 3}]
자 이렇게 리시트를 생성했다면 리스트에서 해당하는 요소를 추출해보자. 이때 역시 패텬매칭을 유의해서 살펴보자. 우선 리스트에서 헤드와 꼬리를 분리해 내자[{apples, 10}, {pears, 6}, {milk, 3}]
2> ThingsToBuy1 = [{oranges, 4}, {newspaper, 1}|ThingsToBuy].
[{apples, 10}, {pears, 6}, {milk, 3}]
4> [Buy1|ThingsToBuy2] = ThingsToBuy1.
[{oranges, 4}, {newspaper, 1}, {apples, 10}, {pears, 6}, {milk, 3}]
5> [Buy2, Buy3|ThingsToBuy3] = ThingsToBuy2.
[{newspaper, 1}, {apples, 10}, {pears, 6}, {milk, 3}]
6> Buy2.
{newspaper, 1}
이 렇게 하면 Buy1에는 {oranges, 4}가 바인딩 되고 나머지가 ThingsToBuy2에 바인딩 된다. 이렇게 하나하나 패턴 매칭을 사용해 리스트에서 하나하나 요소를 추출하면 된다. 즉 5번째 라인이 끝나면, 각각 어떻게 바인딩이 되는지 확인해 보면 될 것이다.[{oranges, 4}, {newspaper, 1}, {apples, 10}, {pears, 6}, {milk, 3}]
5> [Buy2, Buy3|ThingsToBuy3] = ThingsToBuy2.
[{newspaper, 1}, {apples, 10}, {pears, 6}, {milk, 3}]
6> Buy2.
{newspaper, 1}
자 오늘도 여기까지 하고, 다음에 문자열을 시작으로 다시 시작해보도록 하겠다. 그럼 이 글을 읽는 모든 분들에게 오늘 하루 즐겁고 행복만이 가득하길...
'ººº::Development™:: > ::zEtc™::' 카테고리의 다른 글
[Erlang] Eclipse에서 얼랭(Erlang)하기 (2) | 2008.10.06 |
---|---|
[Erlang] 얼랭 간보기 #2 (0) | 2008.09.29 |
[Erlang] 얼랭 출발.. (0) | 2008.09.18 |
[Erlang] 얼래을 시작하다.. (2) | 2008.09.11 |
[기사] 구글, 위치정보 파악용 '기어스지오로케이션 API'공개 (0) | 2008.08.26 |