У Common Lisp рядки тексту (англ. string) - це вектори символів. Їх записують як символи, узяті в подвійні лапки (напр. "Hello World!").
Предикат stringp поверне правду, лише якщо передане значення є рядком тексту.
Рядки тексту можна розбивати на підрядки за допомогою функції subseq, яка приймає рядок, початковий індекс і, за бажанням, кінцевий індекс.
Індексація починається з нуля.
(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"
У цій вправі ми напишемо трохи коду, щоб допомогти Ларрі, прибульцю з Ліспу, розбирати й форматувати рядки журналу (англ. string). Ці рядки журналу надходять із різних систем, і їх потрібно обробити, щоб їхні повідомлення можна було показати на інформативному дисплеї моніторингу.
Рядки журналу мають вигляд "[<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, щоб вивчати й опановувати Common Lisp, а також 27 концепцій92 вправи та справжнє наставництво від людей, і все це безкоштовно.