O Common Lisp tem carateres, tal como as outras linguagens de programação. Os carateres são objetos que representam um item de um conjunto de texto (por exemplo, uma string ou um fluxo de texto).
Os carateres podem ser convertidos em números inteiros e vice-versa. (Mas não são números inteiros: são um tipo distinto.)
Os carateres representam-se como #\ seguido do respetivo nome.
O «nome» dos carateres comuns, como «A», «b», «9» ou «!», é simplesmente esse: #\A, #\b, #\9 e #\!.
Alguns carateres não gráficos, como o espaço ou a nova linha, têm nomes como #\Space e #\Newline.
A norma exige apenas que uma implementação tenha 96 carateres (carateres alfabéticos latinos maiúsculos e minúsculos (A-Za-z), os algarismos (0-9), o espaço (#\Space), a nova linha (#\Newline) e a pontuação (por exemplo, !$"'(),_-./:;?+<=>#%&*@[\]{|}`^~)
No entanto, a maioria das implementações oferece mais do que isso, incluindo implementações que disponibilizam todos os carateres Unicode.
Os carateres podem ser comparados quanto à igualdade com char= ou char-equal (sendo que este último não distingue maiúsculas de minúsculas).
Os carateres podem ser ordenados com funções como char<, char>, char<=, char>= e as respetivas versões que não distinguem maiúsculas de minúsculas, char-lessp e char-greaterp.
Os carateres podem ser categorizados em diferentes tipos: gráfico, alfabético, alfanumérico, algarismo, maiúscula ou minúscula.
Um caráter pode ser de mais do que um tipo, como um caráter alfabético maiúsculo.
Existem predicados para cada um destes tipos: graphic-char-p, alpha-char-p, alphanumericp, digit-char-p, upper-case-p e lower-case-p.
Alguns carateres podem ser maiúsculos ou minúsculos e podem ser convertidos entre si com char-upcase e char-downcase.
O Lewis, um jovem Lisp Alien, tem trabalho para fazer no seu projeto de alfabetos humanos e pergunta-te se o podes ajudar a programar algumas funções de que vai precisar.
O Lewis vai precisar de uma função para comparar dois carateres, que determine se o primeiro é maior do que, menor do que ou igual ao segundo.
Escreve uma função compare-chars que receba dois carateres e devolva :greater-than, :less-than ou :equal-to, conforme o caso.
A função deve comparar distinguindo maiúsculas de minúsculas.
O Lewis precisa de saber se um caráter é «grande» (um caráter maiúsculo), «pequeno» (um caráter minúsculo) ou «sem tamanho», se não for nenhum dos dois.
Escreve uma função size-of-char que devolva :big, :small ou :no-size, consoante o «tamanho» do caráter:
O Lewis pode precisar de transformar um caráter grande num pequeno, ou um caráter pequeno num grande.
Escreve uma função change-size-of-char que recebe dois parâmetros: um caráter e um tamanho pretendido (:big ou :small).
Deve devolver o caráter correspondente, com o tamanho correto.
O Lewis não vai precisar apenas de saber qual é o «tamanho» do caráter, mas também o seu «tipo».
Escreve uma função type-of-char que devolva :alpha se o caráter for alfabético, :numeric se for numérico, :space se for um espaço, :newline se for uma nova linha, e :unknown nos restantes casos.
Inscreve-te no Exercism para aprenderes e dominares Common Lisp com 27 conceitos92 exercícios, e mentoria humana real, tudo grátis.