Elixir의 atom 타입은 고정된 상수를 나타내요. 아톰의 값은 그저 자기 이름이에요. 덕분에 데이터를 타입에 안전한 방식으로 다룰 수 있죠. 아톰은 다음과 같이 정의할 수 있어요:
# All atoms are preceded with a ':' then follow with alphanumeric snake-cased characters
variable = :an_atom
_아톰_은 내부적으로 룩업 테이블의 정수로 표현되는데, 이 값은 자동으로 정해져요. 이 내부 값은 바꿀 수 없어요.
조건에 따라 분기하는 코드를 작성하고 싶을 때가 많아요. Elixir에서 이걸 하는 방법은 여러 가지지만, 가장 간단한 방법 중 하나는 cond/1을 사용하는 거예요.
가장 단순하게 말하면, cond는 하나 이상의 분기 중에서 true로 평가되는 첫 번째 경로를 따라가요:
cond do
x > 10 -> :this_might_be_the_way
y < 7 -> :or_that_might_be_the_way
true -> :this_is_the_default_way
end
true로 평가되는 경로가 없으면 런타임이 오류를 발생시켜요.
여러 애플리케이션이 많은 로그를 만들어 내는 시스템을 운영하고 있어요. 이 로그들을 모아서 심각도에 따라 레이블을 붙여 주는 작은 프로그램을 작성하려고 해요. 시스템의 모든 애플리케이션은 같은 로그 코드를 사용하지만, 일부 레거시 애플리케이션은 모든 코드를 지원하지는 않아요.
| 로그 코드 | 로그 레이블 | 레거시 앱에서 지원하나요? |
|---|---|---|
| 0 | trace | 아니요 |
| 1 | debug | 예 |
| 2 | info | 예 |
| 3 | warning | 예 |
| 4 | error | 예 |
| 5 | fatal | 아니요 |
| 기타 / 지원되지 않음 | unknown | - |
LogLevel.to_label/2 함수를 구현해요. 이 함수는 정수 코드와, 로그가 레거시 앱에서 온 것인지 알려 주는 불리언 플래그를 받아서, 로그 라인의 레이블을 아톰으로 반환해야 해요.
표에 명시되지 않은 로그 코드는 unknown 레이블을 반환해야 해요. 레거시 앱에서 지원되지 않는다고 표에 명시된 로그 코드도, 로그가 레거시 앱에서 왔다면 unknown 레이블을 반환해야 해요.
LogLevel.to_label(0, false)
# => :trace
LogLevel.to_label(0, true)
# => :unknown
예상치 못한 일이 생기면 누군가는 알림을 받아야 해요.
알림을 누구에게 보내야 하는지 결정하는 LogLevel.alert_recipient/2 함수를 구현해요. 이 함수는 정수 코드와, 로그가 레거시 앱에서 온 것인지 알려 주는 불리언 플래그를 받아서, 수신자의 이름을 아톰으로 반환해야 해요.
이전 과제의 LogLevel.to_label/2 함수를 사용해요. 로그 레이블이 error 또는 _fatal_이면 ops 팀에 알림을 보내요. 레거시 시스템에서 unknown 레이블이 붙은 로그를 받으면 dev1 팀에 알림을 보내고, 그 밖의 unknown 레이블은 dev2 팀에 보내요. 나머지 로그 레이블은 _false_를 반환해서 무시해도 돼요.
LogLevel.alert_recipient(-1, true)
# => :dev1
LogLevel.alert_recipient(0, false)
# => false
Exercism에 가입하고 Elixir 트랙을 개념 58개연습 문제 168개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.