トラック
/
Common Lisp
Common Lisp
/
演習
/
ログレベル
ログレベル

ログレベル

学習演習

はじめに

文字列

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のいずれかになります。

1. メッセージを取り出す

ログ文字列を受け取り、その中に含まれるメッセージに評価される関数log-messageを定義します。

(log-message "[ohno]: whoops!") ; => "whoops!"

2. 深刻度を判定する

ログ文字列のレベルによって、その深刻度が決まります。

  • レベルがinfoなら、深刻度は:everything-okです
  • レベルがwarnなら、深刻度は:getting-worriedです
  • レベルがohnoなら、深刻度は:run-for-coverです

ログ文字列を受け取り、正しい深刻度に評価される関数log-severityを定義します。

(log-severity "[warn]: might want to get that checked") ; => :getting-worried

3. 現実の気まぐれに対処する

残念ながら、ログ文字列がいつも正しく整形されているとは限りません。特に、ログレベルが上で指定したようなすべて小文字になっていないことがあります。これに対応できるよう、log-severityを修正します。

(log-severity "[WaRn]: string case system failing") ; => :getting-worried

4. ログの深刻度に応じてログメッセージを整形する

深刻度に応じて、メッセージは次のように変更します。

  • 深刻度が:everything-okなら、メッセージをすべて小文字に変更します。
  • 深刻度が:getting-worriedなら、メッセージの各単語を先頭が大文字になるように変更します。
  • 深刻度が:run-for-coverなら、メッセージをすべて大文字に変更します。

ログメッセージを受け取り、適切に整形されたメッセージに評価される関数log-formatを定義します。

(log-format "[ohno]: whoops!") ; => WHOOPS!
GitHubで編集する リンクは新しいウィンドウまたはタブで開きます
Common Lisp Exercism

ログレベルを始める準備はできましたか?

Exercismに登録すれば、27個のコンセプト92個の演習、そして本物の人間によるメンタリングとともに、Common Lispを学んでマスターできます。すべて無料です。