erlang : 코테 풀면서 문법 정리

    1. 가드 절에는 다양한 함수가 올 순 없음

    가드 절에서는 사용자 정의 함수를 사용할 수는 없다. 가드 절에서 사용할 수 있도록 정의된 몇몇 함수만 호출할 수 있다.

     

    2. If 절에서 마지막 부분은 항상 true로 처리

    case ... of 문을 이용할 때, '아무거나 와도 상관없음'을 '_'로 표현했지만, If절은 'true'로 처리한다. If절은 패턴 매칭이 아니라 true / false를 판단하기 때문인 듯. 

     

    3. 함수와 클로저 

    handle_regular_file(Name, Queue) ->
      case filename:extension(Name) of
        ".erl" -> {continue, Name, fun() -> dequeue_and_run(Queue) end};
        _NonErl -> dequeue_and_run(Queue)
      end.
    • 여기서 fun()에서 생성된 익명함수 객체는 선언된 시점의 Queue 변수 참조를 포함한다. 
    • 이 익명함수 객체는 Queue 변수 참조를 가지고 있기 때문에 나중에 호출될 때, Queue와 동일한 값을 참조함. 
    • 이것은 erlang의 클로저 개념 때문임.
    • 이런 개념은 함수형 프로그래밍에서 자주 활용되며, 함수의 상태를 보존하고 재사용할 수 있도록 해줌. 

     

     

    4. List를 Map으로 바꿀 때

    erlang에서 List는 링크드 리스트라 업데이트 할 때 마다 O(N) 시간이 필요함. 따라서 처음부터 List를 Map으로 만들고, Index로 접근하는게 그나마 좋다. 

    ColumnFun =
      fun({Index, Value}, Acc) ->
        maps:put(Index, Value, Acc)
      end,
    
    GridMaps = lists:foldl(
      fun({Index, Element}, Acc) ->
          ListToMap = lists:foldl(ColumnFun, #{}, lists:enumerate(?START_INDEX, Element)),
          maps:put(Index, ListToMap, Acc)
      end,
      #{},
      lists:enumerate(?START_INDEX, Grid)),

    위 코드를 이용해 리스트를 만들 수 있음. 

     

    5. 이중 List를 이중 Map으로 바꾸었을 때, 접근 및 Put 하기

    put(Map, R, C, NewValue) ->
      Col = maps:get(R, Map),
      NewCol = maps:put(C, NewValue, Col),
      maps:put(R, NewCol, Map).
    
    get(Map, R, C) ->
      maps:get(C, maps:get(R, Map)).

    put은 반드시 이렇게 작성해야 함. 조금 더 줄여서 작성한다고 하면, Column만 put()의 결과로 돌려주게 됨. 

     

     

     

    댓글

    Designed by JB FACTORY