Common Lisp ha i caratteri, come gli altri linguaggi di programmazione. I caratteri sono oggetti che rappresentano un elemento all'interno di una quantità di testo (ad esempio una stringa o un flusso di testo).
I caratteri possono essere convertiti in numeri interi e viceversa. (Ma non sono numeri interi: sono un tipo a sé stante.)
I caratteri si rappresentano con #\ seguito dal loro nome.
Il «nome» dei caratteri comuni come 'A' o 'b' o '9' o '!' è semplicemente quello: quindi #\A, #\b, #\9 e #\!.
Alcuni caratteri non grafici, come lo spazio o la nuova riga, hanno nomi come #\Space e #\Newline.
Lo standard richiede a un'implementazione di avere solo 96 caratteri (i caratteri alfabetici latini maiuscoli e minuscoli (A-Za-z), le cifre (0-9), lo spazio (#\Space), la nuova riga (#\Newline) e la punteggiatura (ad esempio !$"'(),_-./:;?+<=>#%&*@[\]{|}`^~).
Tuttavia, la maggior parte delle implementazioni ne offre di più, comprese quelle che forniscono tutti i caratteri Unicode.
I caratteri possono essere confrontati per uguaglianza con char= o char-equal (quest'ultimo non distingue tra maiuscole e minuscole).
I caratteri possono essere ordinati con funzioni come char<, char>, char<=, char>= e le loro versioni che non distinguono tra maiuscole e minuscole, char-lessp e char-greaterp.
I caratteri possono essere classificati in tipi diversi: grafici, alfabetici, alfanumerici, cifre, maiuscoli o minuscoli.
Un carattere può appartenere a più di un tipo, come un carattere alfabetico maiuscolo.
Esistono predicati per ciascuno di questi tipi: graphic-char-p, alpha-char-p, alphanumericp, digit-char-p, upper-case-p e lower-case-p.
Alcuni caratteri possono essere maiuscoli o minuscoli e si possono convertire dall'uno all'altro con char-upcase e char-downcase.
Lewis, un giovane alieno Lisp, deve portare a termine un po' di lavoro sul proprio progetto sugli alfabeti umani e ti chiede se puoi aiutarlo a programmare alcune funzioni che gli serviranno.
Lewis avrà bisogno di una funzione per confrontare due caratteri, stabilendo se il primo è maggiore, minore o uguale al secondo.
Scrivi una funzione compare-chars che prenderà due caratteri e restituirà :greater-than, :less-than o :equal-to a seconda dei casi.
La funzione deve distinguere tra maiuscole e minuscole.
Lewis deve sapere se un carattere è «grande» (un carattere maiuscolo) o «piccolo» (un carattere minuscolo), oppure «senza dimensione» se non è né l'uno né l'altro.
Scrivi una funzione size-of-char che restituirà :big, :small o :no-size a seconda della «dimensione» del carattere:
Lewis potrebbe aver bisogno di trasformare un carattere grande in piccolo, o un carattere piccolo in grande.
Scrivi una funzione change-size-of-char che prende due parametri: un carattere e una dimensione desiderata (:big o :small).
Deve restituire il carattere corrispondente della dimensione corretta.
Lewis non avrà bisogno solo di sapere qual è la «dimensione» del carattere, ma anche il suo «tipo».
Scrivi una funzione type-of-char che restituirà :alpha se il carattere è alfabetico, :numeric se è numerico, :space se è uno spazio, :newline se è un carattere di nuova riga e :unknown altrimenti.
Iscriviti a Exercism per imparare e padroneggiare Common Lisp con 27 concetti92 esercizi e il mentoring di persone reali, tutto gratis.