Common Lisp에서 문자열은 문자의 벡터예요. 큰따옴표로 감싼 문자로 쓰죠. 예를 들어 "Hello World!"처럼요.
stringp 술어는 주어진 값이 문자열일 때만 참을 반환해요.
subseq 함수를 사용하면 문자열을 부분 문자열로 나눌 수 있어요. 이 함수는 문자열과 시작 인덱스를 받고, 원한다면 끝 인덱스도 받아요. 인덱스는 0부터 시작해요.
(subseq "Hello World" 1 5) ; => "ello"
(subseq "skip to the end" 5) ; => "to the end"
두 문자열이 같은지 비교할 때는 string=을 사용해요.
대소문자를 구분하지 않으려면 string-equal을 쓰면 돼요.
(string= "macaroni" "macaroni") ; => T
(string= "macaroni" "MACARONI") ; => NIL
(string-equal "macaroni" "MACARONI") ; => T
문자열을 전부 대문자로, 전부 소문자로, 또는 각 단어의 첫 글자만 대문자로 바꿀 때는 string-upcase, string-downcase, string-capitalize 함수를 사용해요.
(string-upcase "not too loud") ; => "NOT TOO LOUD"
(string-downcase "YELL IT FROM THE ROOFTOPS") ; => "yell it from the rooftops"
(string-capitalize "practical COMMON LiSP") ; => "Practical Common Lisp"
이 연습 문제에서는 Lisp 외계인 Larry를 도와 로그 문자열을 파싱하고 형식을 정리하는 코드를 작성해요. 이 로그 문자열은 여러 시스템에서 들어오는데, 담긴 메시지를 정보를 한눈에 볼 수 있는 모니터링 화면에 표시하려면 가공이 필요해요.
로그 문자열은 "[<level>]: <message>" 형태예요. <level>은 info, warn, ohno 중 하나예요.
로그 문자열을 받아 그 안에 담긴 메시지로 평가되는 함수 log-message를 정의해요.
(log-message "[ohno]: whoops!") ; => "whoops!"
로그 문자열의 레벨에 따라 심각도가 정해져요.
info인 경우 심각도는 :everything-ok에 해당해요.warn인 경우 심각도는 :getting-worried에 해당해요.ohno인 경우 심각도는 :run-for-cover에 해당해요.로그 문자열을 받아 올바른 심각도로 평가되는 함수 log-severity를 정의해요.
(log-severity "[warn]: might want to get that checked") ; => :getting-worried
안타깝게도 로그 문자열이 항상 올바른 형식으로 들어오지는 않아요. 특히 로그 레벨이 위에서 정한 것처럼 전부 소문자가 아닐 수도 있어요. log-severity를 고쳐서 이런 경우도 처리해 봐요.
(log-severity "[WaRn]: string case system failing") ; => :getting-worried
심각도에 따라 메시지를 서로 다른 방식으로 바꿔야 해요.
:everything-ok인 경우 메시지를 모두 소문자로 바꿔요.:getting-worried인 경우 메시지에서 각 단어의 첫 글자를 대문자로 바꿔요.:run-for-cover인 경우 메시지를 모두 대문자로 바꿔요.로그 메시지를 받아 올바른 형식의 메시지로 평가되는 함수 log-format을 정의해요.
(log-format "[ohno]: whoops!") ; => WHOOPS!
Exercism에 가입하고 Common Lisp 트랙을 개념 27개연습 문제 92개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.