StatCounter - Free Web Tracker and Counter

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