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