Factor 的字元是整數,也就是 Unicode 碼位,所以直接用<、>、=這些數值運算子,就能得到區分大小寫的排序。unicode 詞彙則新增了能辨識 Unicode 的述詞,以及單一字元的大小寫轉換。
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 和 ch>lower 會轉換單一字元的大小寫。字串層級的>upper和>lower則會把它們套用到字串中的每個字元。
CHAR: a ch>upper . ! => 65 (which is CHAR: A)
"Hello" >upper . ! => "HELLO"
capitalize 會先把整串字串轉成小寫,再把第一個字元轉成大寫,也就是單一詞的標題大小寫:
"hELLO" capitalize . ! => "Hello"
CHAR: A 會解析成A的整數碼位。如果要使用具名字元,可以用space、tab、\n等名稱:
CHAR: A . ! => 65
CHAR: space . ! => 32
CHAR: \n . ! => 10
當一個詞需要回傳標籤而不是值時,例如用yes/no/maybe代替布林值,就把每個標籤宣告成符號。符號是一種在被呼叫時會把自己推入堆疊的詞,而兩個符號只有在名稱相同時才會被視為相等。
USING: kernel ;
SYMBOLS: yes no maybe ;
yes . ! => yes
yes yes = . ! => t
yes no = . ! => f
SYMBOL: name 宣告一個符號;SYMBOLS: a b c ; 則可以一次宣告多個。
Heidi 是一位年輕的 Forth 外星人,她的人類字母表專案還有一些工作要完成,於是請你幫她寫幾個她會用到的字詞。
定義compare-chars,接收兩個字元,並根據第一個字元是小於、大於還是等於第二個字元,回傳符號less、greater或equal。比較時請區分大小寫。
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
海蒂需要知道一個字元是「big」(大寫)、「small」(小寫),還是「no-size」(沒有大小)。定義size-of-char回傳big、small或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
海蒂有時候需要把字元切成不同的大小。定義change-size-of-char,接收一個字元和想要的大小(big或small),回傳對應大小寫的字元。
CHAR: a big change-size-of-char . ! => 65 (CHAR: A)
CHAR: A small change-size-of-char . ! => 97 (CHAR: a)
海蒂還需要知道字元是哪一種類型。定義type-of-char回傳:
alpha:任何字母(大寫或小寫)numeric:十進位數字space:空格字元newline:換行字元unknown:其他情況CHAR: 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