Factorの文字は整数、つまりUnicodeのコードポイントです。なので、数値としての<、>、=を使えば、大文字と小文字を区別した順序付けがそのまま得られます。unicodeボキャブラリーを読み込むと、Unicodeを考慮した述語や、1文字単位の大文字・小文字変換が使えるようになります。
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は、1文字を変換します。文字列レベルの>upperと>lowerは、それを文字列のすべての文字に適用します。
CHAR: a ch>upper . ! => 65 (which is CHAR: A)
"Hello" >upper . ! => "HELLO"
capitalizeは、文字列全体を小文字にしてから、最初の1文字を大文字にします。これは1語のタイトルケースです。
"hELLO" capitalize . ! => "Hello"
CHAR: Aは、Aのコードポイントの整数値として解釈されます。名前の付いた文字には、space、tab、\nなどの名前を使います。
CHAR: A . ! => 65
CHAR: space . ! => 32
CHAR: \n . ! => 10
ワードが値ではなくタグを返す必要があるとき、たとえば真偽値の代わりにyes/no/maybeを返したいときには、それぞれのタグをシンボルとして宣言します。シンボルは、呼び出すと自分自身をスタックにプッシュするワードです。2つのシンボルは、同じ名前であるときだけ等しいと判定されます。
USING: kernel ;
SYMBOLS: yes no maybe ;
yes . ! => yes
yes yes = . ! => t
yes no = . ! => f
SYMBOL: nameは1つを宣言し、SYMBOLS: a b c ;は複数をまとめて宣言します。
Forth星人の若いハイジは、「人間のアルファベット」プロジェクトの作業を進めていて、これから必要になるいくつかの単語をプログラムするのを手伝ってほしいと頼んできます。
compare-charsを定義して、2つの文字を受け取り、1つ目の文字が2つ目より小さいか、大きいか、等しいかに応じて、シンボル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」(小文字)なのか、それとも大きさを持たないのかを知る必要があります。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:10進数の数字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