In Common Lisp le stringhe sono array di caratteri. Si scrivono come caratteri racchiusi tra virgolette doppie (ad esempio "Hello World!").
Il predicato stringp restituisce vero solo se il valore dato è una stringa.
Le stringhe si possono dividere in sotto-stringhe con la funzione subseq, che prende la stringa, un indice di inizio e, facoltativamente, un indice di fine.
Gli indici partono da zero.
(subseq "Hello World" 1 5) ; => "ello"
(subseq "skip to the end" 5) ; => "to the end"
Le stringhe si possono confrontare per uguaglianza con string=.
Se le maiuscole e le minuscole dei caratteri vanno ignorate, si può usare string-equal.
(string= "macaroni" "macaroni") ; => T
(string= "macaroni" "MACARONI") ; => NIL
(string-equal "macaroni" "MACARONI") ; => T
Operazioni come la conversione in maiuscolo, la conversione in minuscolo e la capitalizzazione delle stringhe si possono fare con 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"
In questo esercizio scriverai del codice per aiutare Larry the Lisp Alien ad analizzare e formattare le stringhe di log. Queste stringhe di log arrivano da vari sistemi e devono essere elaborate, così che i loro messaggi possano comparire su un pannello di monitoraggio informativo.
Le stringhe di log hanno la forma "[<level>]: <message>". Il livello sarà uno dei seguenti valori: info, warn o ohno.
Definisci una funzione log-message che prende una stringa di log e restituisce il messaggio che contiene.
(log-message "[ohno]: whoops!") ; => "whoops!"
Il livello della stringa di log ne determina la gravità.
info corrisponde a una gravità di :everything-ok
warn corrisponde a una gravità di :getting-worried
ohno corrisponde a una gravità di :run-for-cover
Definisci una funzione log-severity che prende una stringa di log e restituisce la gravità corretta.
(log-severity "[warn]: might want to get that checked") ; => :getting-worried
Purtroppo a volte le stringhe di log non sono sempre formattate correttamente. In particolare, il livello del log potrebbe non essere tutto in minuscolo come indicato sopra. Modifica log-severity per gestire questa situazione.
(log-severity "[WaRn]: string case system failing") ; => :getting-worried
A seconda della gravità, il messaggio deve essere modificato in modi diversi:
:everything-ok deve avere il messaggio trasformato tutto in minuscolo.:getting-worried deve avere il messaggio trasformato con ogni parola che inizia con la maiuscola.:run-for-cover deve avere il messaggio trasformato tutto in maiuscolo.Definisci una funzione log-format che prende un messaggio di log e restituisce un messaggio formattato correttamente.
(log-format "[ohno]: whoops!") ; => WHOOPS!
Iscriviti a Exercism per imparare e padroneggiare Common Lisp con 27 concetti92 esercizi e il mentoring di persone reali, tutto gratis.