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 Alien,手头的人类字母表项目还有些活儿要干,她问你能否帮她编写一些她需要的单词。
定义 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
Heidi 需要知道一个字符是“big”(大写)、“small”(小写),还是没有任何大小。定义 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
Heidi 有时需要把一个字符切换成另一种大小。定义 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)
Heidi 还需要知道一个字符属于哪种类型。定义 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