Os carateres em Factor são números inteiros (pontos de código Unicode), por isso os operadores numéricos <, >, = dão-te diretamente uma ordenação que distingue maiúsculas de minúsculas. O vocabulário unicode acrescenta predicados que têm em conta o Unicode e a conversão de maiúsculas e minúsculas de um único caráter.
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 convertem um único caráter. As operações ao nível da string, >upper e >lower, aplicam-nas a cada caráter de uma string.
CHAR: a ch>upper . ! => 65 (which is CHAR: A)
"Hello" >upper . ! => "HELLO"
capitalize passa uma string inteira para minúsculas e depois põe o primeiro caráter em maiúscula, ou seja, a capitalização de título de uma única palavra:
"hELLO" capitalize . ! => "Hello"
CHAR: A é interpretado como o ponto de código inteiro de A. Para carateres com nome, usa os nomes space, tab, \n, etc.:
CHAR: A . ! => 65
CHAR: space . ! => 32
CHAR: \n . ! => 10
Quando uma palavra precisa de devolver uma etiqueta em vez de um valor, por exemplo yes/no/maybe em vez de um Boolean, declara cada etiqueta como um símbolo. Um símbolo é uma palavra que se coloca a si própria na pilha quando é chamada, e dois símbolos só são considerados iguais quando têm o mesmo nome.
USING: kernel ;
SYMBOLS: yes no maybe ;
yes . ! => yes
yes yes = . ! => t
yes no = . ! => f
SYMBOL: name declara um; SYMBOLS: a b c ; declara vários.
A Heidi, uma jovem alienígena de Forth, precisa de adiantar trabalho no seu projeto de alfabetos humanos e pergunta-te se a podes ajudar a programar algumas palavras de que vai precisar.
Define compare-chars para receber dois carateres e devolver o símbolo less, greater ou equal, conforme o primeiro seja menor que, maior que ou igual ao segundo. A comparação distingue maiúsculas de 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
A Heidi precisa de saber se um caráter é "big" (maiúsculo), "small" (minúsculo) ou se não tem tamanho. Define size-of-char para devolver 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
Por vezes, a Heidi precisa de mudar um caráter para um tamanho diferente. Define change-size-of-char para receber um caráter e um tamanho pretendido (big ou small) e devolver o caráter com a caixa correspondente.
CHAR: a big change-size-of-char . ! => 65 (CHAR: A)
CHAR: A small change-size-of-char . ! => 97 (CHAR: a)
A Heidi também precisa de saber que tipo de caráter é. Define type-of-char para devolver:
alpha para qualquer letra (maiúscula ou minúscula)numeric para um algarismo decimalspace para o caráter de espaçonewline para o caráter de nova linhaunknown caso contrárioCHAR: 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
Inscreve-te no Exercism para aprenderes e dominares Factor com 47 conceitos163 exercícios, e mentoria humana real, tudo grátis.