日誌等級

日誌等級

學習練習

簡介

字串

在 Common Lisp 中,字串是字元的向量。它們的寫法是把字元用雙引號包起來(例如「Hello World!」)。

stringp 述詞只有在給定的值是字串時,才會回傳 true。

字串可以用 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,全部免費。