Los caracteres en Factor son números enteros, es decir, puntos de código Unicode, así que los operadores numéricos <, >, = te dan directamente un orden que distingue mayúsculas de minúsculas. El vocabulario unicode añade predicados que tienen en cuenta Unicode y la conversión de mayúsculas y minúsculas de caracteres sueltos.
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 y ch>lower cambian un solo carácter. >upper y >lower, a nivel de string, los aplican a todos los caracteres de un string.
CHAR: a ch>upper . ! => 65 (which is CHAR: A)
"Hello" >upper . ! => "HELLO"
capitalize pasa todo un string a minúsculas y después pone en mayúscula su primer carácter, lo que da la capitalización de una sola palabra:
"hELLO" capitalize . ! => "Hello"
CHAR: A se convierte al punto de código entero de A. Para los caracteres con nombre, usa los nombres space, tab, \n, etc.:
CHAR: A . ! => 65
CHAR: space . ! => 32
CHAR: \n . ! => 10
Cuando una palabra tiene que devolver una etiqueta en lugar de un valor, por ejemplo yes/no/maybe en vez de un Boolean, declara cada etiqueta como un símbolo. Un símbolo es una palabra que se apila a sí misma cuando se llama, y dos símbolos se consideran iguales solo si tienen el mismo nombre.
USING: kernel ;
SYMBOLS: yes no maybe ;
yes . ! => yes
yes yes = . ! => t
yes no = . ! => f
SYMBOL: name declara uno; SYMBOLS: a b c ; declara varios.
Heidi, una joven alienígena de Forth, necesita avanzar un poco en su proyecto de alfabetos humanos y te pregunta si puedes ayudarla a programar algunas palabras que necesitará.
Define compare-chars para que tome dos caracteres y devuelva el símbolo less, greater o equal, según si el primero es menor que, mayor que o igual que el segundo. Compara distinguiendo entre mayúsculas y minúsculas.
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 necesita saber si un carácter es «big» (mayúscula), «small» (minúscula), o si no tiene tamaño. Define size-of-char para que devuelva 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 veces Heidi necesita cambiar un carácter a otro tamaño. Define change-size-of-char para que tome un carácter y un tamaño deseado (big o small) y devuelva el carácter en la caja correspondiente.
CHAR: a big change-size-of-char . ! => 65 (CHAR: A)
CHAR: A small change-size-of-char . ! => 97 (CHAR: a)
Heidi también necesita saber qué tipo de carácter es. Define type-of-char para que devuelva:
alpha para cualquier letra (mayúscula o minúscula)numeric para un dígito decimalspace para el carácter de espacionewline para el carácter de nueva líneaunknown en cualquier otro casoCHAR: 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
Regístrate en Exercism para aprender y dominar Factor con 47 conceptos163 ejercicios y mentoría humana real, todo gratis.