在 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。
定義一個函式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!