En Factor, les caractères sont des entiers, à savoir des points de code Unicode, donc les comparaisons numériques <, >, = donnent directement un ordre sensible à la casse. Le vocabulaire unicode apporte des prédicats qui tiennent compte d'Unicode et la conversion de casse d'un seul caractère.
LETTER? ( c -- ? ) ! uppercase letter
letter? ( c -- ? ) ! lowercase letter
Letter? ( c -- ? ) ! letter, either case
digit? ( c -- ? ) ! decimal digit
digit> ( c -- n ) ! the integer value of a digit char
blank? ( c -- ? ) ! whitespace
USING: unicode ;
CHAR: A LETTER? . ! => t
CHAR: a letter? . ! => t
CHAR: 7 digit? . ! => t
CHAR: 7 digit> . ! => 7
ch>upper et ch>lower changent la casse d'un seul caractère. Au niveau d'une string, >upper et >lower les appliquent à tous ses caractères.
CHAR: a ch>upper . ! => 65 (which is CHAR: A)
"Hello" >upper . ! => "HELLO"
capitalize met toute une string en minuscules, puis passe son premier caractère en majuscule, ce qui donne la casse de titre d'un seul mot :
"hELLO" capitalize . ! => "Hello"
CHAR: A s'analyse en le point de code entier de A. Pour les caractères nommés, utilise les noms space, tab, \n, etc. :
CHAR: A . ! => 65
CHAR: space . ! => 32
CHAR: \n . ! => 10
Quand un mot doit renvoyer une étiquette plutôt qu'une valeur, par exemple yes/no/maybe au lieu d'un booléen, déclare chaque étiquette comme un symbole. Un symbole est un mot qui se pousse lui-même lorsqu'on l'appelle, et deux symboles ne se comparent égaux que lorsqu'ils portent le même nom.
USING: kernel ;
SYMBOLS: yes no maybe ;
yes . ! => yes
yes yes = . ! => t
yes no = . ! => f
SYMBOL: name en déclare un ; SYMBOLS: a b c ; en déclare plusieurs.
Heidi, une jeune extraterrestre Forth, a du travail à abattre sur son projet d'alphabets humains et te demande de l'aider à programmer quelques mots dont elle aura besoin.
Définis compare-chars pour qu'elle prenne deux caractères et renvoie le symbole less, greater ou equal selon que le premier est inférieur, supérieur ou égal au second. La comparaison doit être sensible à la casse.
CHAR: A CHAR: B compare-chars . ! => less
CHAR: B CHAR: A compare-chars . ! => greater
CHAR: A CHAR: A compare-chars . ! => equal
CHAR: A CHAR: a compare-chars . ! => less
Heidi a besoin de savoir si un caractère est « big » (majuscule), « small » (minuscule), ou n'a pas de taille. Définis size-of-char pour qu'elle renvoie big, small ou no-size.
CHAR: A size-of-char . ! => big
CHAR: a size-of-char . ! => small
CHAR: 5 size-of-char . ! => no-size
CHAR: space size-of-char . ! => no-size
Heidi a parfois besoin de faire basculer un caractère vers une autre taille. Définis change-size-of-char pour qu'elle prenne un caractère et une taille souhaitée (big ou small) et renvoie le caractère dans la casse correspondante.
CHAR: a big change-size-of-char . ! => 65 (CHAR: A)
CHAR: A small change-size-of-char . ! => 97 (CHAR: a)
Heidi a aussi besoin de savoir de quel type de caractère il s'agit. Définis type-of-char pour qu'elle renvoie :
alpha pour toute lettre (majuscule ou minuscule)numeric pour un chiffre décimalspace pour le caractère espacenewline pour le caractère de nouvelle ligneunknown sinonCHAR: A type-of-char . ! => alpha
CHAR: 5 type-of-char . ! => numeric
CHAR: space type-of-char . ! => space
CHAR: \n type-of-char . ! => newline
CHAR: ! type-of-char . ! => unknown
Inscris-toi sur Exercism pour apprendre et maîtriser Factor avec 47 concepts163 exercices, et un vrai mentorat humain, le tout gratuitement.