I caratteri in Factor sono numeri interi, ossia punti di codice Unicode, quindi gli operatori numerici <, > e = ti danno direttamente un ordinamento che distingue maiuscole e minuscole. Il vocabolario unicode aggiunge predicati che tengono conto di Unicode e la conversione di maiuscole e minuscole su singoli caratteri.
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 e ch>lower cambiano il caso di un singolo carattere. Le versioni per stringa, >upper e >lower, le applicano a ogni carattere di una stringa.
CHAR: a ch>upper . ! => 65 (which is CHAR: A)
"Hello" >upper . ! => "HELLO"
capitalize porta tutta una stringa in minuscolo e poi mette in maiuscolo il suo primo carattere, cioè la maiuscola iniziale di una singola parola:
"hELLO" capitalize . ! => "Hello"
CHAR: A viene analizzato come il punto di codice intero di A. Per i caratteri con un nome, usa i nomi space, tab, \n e così via:
CHAR: A . ! => 65
CHAR: space . ! => 32
CHAR: \n . ! => 10
Quando una parola deve restituire un'etichetta invece di un valore, ad esempio yes/no/maybe al posto di un booleano, dichiara ogni etichetta come un simbolo. Un simbolo è una parola che, quando viene chiamata, mette sé stessa sullo stack: due simboli risultano uguali solo quando hanno lo stesso nome.
USING: kernel ;
SYMBOLS: yes no maybe ;
yes . ! => yes
yes yes = . ! => t
yes no = . ! => f
SYMBOL: name ne dichiara uno; SYMBOLS: a b c ; ne dichiara diversi.
Heidi, una giovane aliena di Forth, deve portare a termine un po' di lavoro sul suo progetto sugli alfabeti umani e ti chiede se puoi aiutarla a programmare alcune parole che le serviranno.
Definisci compare-chars in modo che prenda due caratteri e restituisca il simbolo less, greater o equal a seconda che il primo sia minore, maggiore o uguale al secondo. Il confronto deve distinguere maiuscole e minuscole.
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 deve sapere se un carattere è "big" (maiuscolo), "small" (minuscolo) oppure non ha alcuna dimensione. Definisci size-of-char in modo che restituisca big, small o 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
A volte Heidi deve cambiare la dimensione di un carattere. Definisci change-size-of-char in modo che prenda un carattere e una dimensione desiderata (big o small) e restituisca il carattere con il caso corrispondente.
CHAR: a big change-size-of-char . ! => 65 (CHAR: A)
CHAR: A small change-size-of-char . ! => 97 (CHAR: a)
Heidi deve anche sapere di che tipo è un carattere. Definisci type-of-char in modo che restituisca:
alpha per qualsiasi lettera (maiuscola o minuscola)numeric per una cifra decimalespace per il carattere spazionewline per il carattere di nuova rigaunknown in tutti gli altri casiCHAR: 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
Iscriviti a Exercism per imparare e padroneggiare Factor con 47 concetti163 esercizi e il mentoring di persone reali, tutto gratis.