Em Common Lisp, as strings são vetores de carateres. Escrevem-se como carateres rodeados de aspas duplas (por exemplo, "Hello World!").
O predicado stringp devolve verdadeiro apenas se o valor dado for uma string.
As strings podem ser divididas em substrings com a função subseq, que recebe a string, um índice inicial e, opcionalmente, um índice final.
A indexação começa em zero.
(subseq "Hello World" 1 5) ; => "ello"
(subseq "skip to the end" 5) ; => "to the end"
As strings podem ser comparadas para verificar a igualdade com string=.
Se as maiúsculas e minúsculas dos carateres não importarem, pode usar-se string-equal.
(string= "macaroni" "macaroni") ; => T
(string= "macaroni" "MACARONI") ; => NIL
(string-equal "macaroni" "MACARONI") ; => T
Operações como converter strings para maiúsculas, para minúsculas e capitalizá-las podem ser feitas com string-upcase, string-downcase e 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"
Neste exercício vais escrever algum código para ajudar o Larry, o extraterrestre do Lisp, a analisar e a formatar strings de log. Estas strings de log chegam de vários sistemas e têm de ser processadas para que as suas mensagens possam ser apresentadas num painel de monitorização informativo.
As strings de log têm o formato "[<level>]: <message>". O nível é um dos seguintes valores: info, warn ou ohno.
Define uma função log-message que recebe uma string de log e devolve a mensagem que contém.
(log-message "[ohno]: whoops!") ; => "whoops!"
O nível da string de log determina a sua gravidade.
info significa uma gravidade :everything-ok
warn significa uma gravidade :getting-worried
ohno significa uma gravidade :run-for-cover
Define uma função log-severity que recebe uma string de log e devolve a gravidade correta.
(log-severity "[warn]: might want to get that checked") ; => :getting-worried
Infelizmente, às vezes as strings de log não estão formatadas corretamente. Mais concretamente, o nível de log pode não estar todo em minúsculas como indicado acima. Modifica a função log-severity para lidar com isto.
(log-severity "[WaRn]: string case system failing") ; => :getting-worried
Consoante a gravidade, a mensagem deve ser modificada de formas diferentes:
:everything-ok deve ter a sua mensagem alterada para tudo em minúsculas.:getting-worried deve ter a sua mensagem alterada para que cada palavra fique com inicial maiúscula.:run-for-cover deve ter a sua mensagem alterada para tudo em maiúsculas.Define uma função log-format que recebe uma mensagem de log e devolve uma mensagem devidamente formatada.
(log-format "[ohno]: whoops!") ; => WHOOPS!
Inscreve-te no Exercism para aprenderes e dominares Common Lisp com 27 conceitos92 exercícios, e mentoria humana real, tudo grátis.