轨道
/
Factor
Factor
/
练习
/
字符研究
字符研究

字符研究

学习练习

简介

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,手头的人类字母表项目还有些活儿要干,她问你能否帮她编写一些她需要的单词。

1. 比较两个字符

定义 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

2. 确定字符的大小

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

3. 改变字符的大小

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)

4. 确定字符的类型

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
通过 GitHub 编辑 链接将在新窗口或新标签页中打开
Factor Exercism

准备好开始 字符研究 了吗?

注册 Exercism,借助 47 个概念163 个练习 和真人导师指导,学习并掌握 Factor,全部免费。