Common Lispでは、文字列は文字のベクトルです。二重引用符で文字を囲んで書きます(例えば"Hello World!")。
stringpは、与えられた値が文字列のときだけtrueを返す述語です。
文字列は、subseq関数で部分文字列に分割できます。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"
この演習では、Larry the Lisp Alienがログ文字列を解析して整形できるようにするコードを書きます。こうしたログ文字列はさまざまなシステムから送られてくるので、そのメッセージをわかりやすい監視画面に表示できるよう、処理する必要があります。
ログ文字列は"[<level>]: <message>"という形式です。レベルは、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に登録すれば、27個のコンセプト92個の演習、そして本物の人間によるメンタリングとともに、Common Lispを学んでマスターできます。すべて無料です。