erlang : 코테 풀면서 문법 정리
- 프로그래밍 언어/erlang
- 2024. 2. 19.
반응형
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()의 결과로 돌려주게 됨.
'프로그래밍 언어 > erlang' 카테고리의 다른 글
erlang : 여러 Case / If 문이 내포되었을 때 복잡도 감소? (0) | 2024.02.20 |
---|---|
얼랭 가드절의 패턴매칭 (0) | 2024.01.21 |
erlang 공부 : The Count of Applications (2) | 2024.01.07 |
Erlang 공부 : Distribunomicon 2부 (0) | 2024.01.07 |
Erlang 공부 : Distribunomicon (0) | 2024.01.02 |