Zeichen sind in Factor Ganzzahlen, genauer Unicode-Codepunkte. Deshalb liefern dir die numerischen Vergleiche <, >, = direkt eine Sortierung, die Groß- und Kleinschreibung beachtet. Das Vokabular unicode fügt Unicode-fähige Prädikate und die Umwandlung der Schreibweise einzelner Zeichen hinzu.
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 und ch>lower ändern die Schreibweise eines einzelnen Zeichens. Die String-Operatoren >upper und >lower wenden sie auf jedes Zeichen eines Strings an.
CHAR: a ch>upper . ! => 65 (which is CHAR: A)
"Hello" >upper . ! => "HELLO"
capitalize wandelt einen ganzen String in Kleinbuchstaben um und setzt anschließend das erste Zeichen in Großbuchstaben. Das ergibt die Titelschreibweise eines einzelnen Wortes:
"hELLO" capitalize . ! => "Hello"
CHAR: A wird zum ganzzahligen Codepunkt von A ausgewertet. Für benannte Zeichen verwendest du die Namen space, tab, \n usw.:
CHAR: A . ! => 65
CHAR: space . ! => 32
CHAR: \n . ! => 10
Wenn ein Wort statt eines Werts ein Tag zurückgeben soll, zum Beispiel yes/no/maybe statt eines booleschen Werts, dann deklariere jedes Tag als Symbol. Ein Symbol ist ein Wort, das sich selbst auf den Stack legt, wenn es aufgerufen wird. Zwei Symbole sind nur dann gleich, wenn sie denselben Namen haben.
USING: kernel ;
SYMBOLS: yes no maybe ;
yes . ! => yes
yes yes = . ! => t
yes no = . ! => f
SYMBOL: name deklariert eines, SYMBOLS: a b c ; deklariert mehrere.
Heidi, ein junges Forth-Alien, muss an ihrem Projekt „Human alphabets“ weiterkommen und fragt dich, ob du ihr helfen kannst, ein paar Wörter zu programmieren, die sie braucht.
Definiere compare-chars so, dass es zwei Zeichen entgegennimmt und das Symbol less, greater oder equal zurückgibt, je nachdem, ob das erste kleiner als, größer als oder gleich dem zweiten ist. Vergleiche unter Beachtung der Groß- und Kleinschreibung.
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 muss wissen, ob ein Zeichen „big“ (Großbuchstabe), „small“ (Kleinbuchstabe) ist oder gar keine Größe hat. Definiere size-of-char so, dass es big, small oder no-size zurückgibt.
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 muss ein Zeichen manchmal in eine andere Größe umwandeln. Definiere change-size-of-char so, dass es ein Zeichen und eine gewünschte Größe (big oder small) entgegennimmt und das Zeichen in der entsprechenden Schreibweise zurückgibt.
CHAR: a big change-size-of-char . ! => 65 (CHAR: A)
CHAR: A small change-size-of-char . ! => 97 (CHAR: a)
Heidi muss außerdem wissen, um welche Art von Zeichen es sich handelt. Definiere type-of-char so, dass es Folgendes zurückgibt:
alpha für jeden Buchstaben (groß oder klein)numeric für eine Dezimalzifferspace für das Leerzeichennewline für das Zeilenumbruchzeichenunknown sonstCHAR: 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
Melde dich bei Exercism an, um Factor mit 47 Konzepte163 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.