トラック
/
Factor
Factor
/
演習
/
文字の研究
文字の研究

文字の研究

学習演習

はじめに

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星人の若いハイジは、「人間のアルファベット」プロジェクトの作業を進めていて、これから必要になるいくつかの単語をプログラムするのを手伝ってほしいと頼んできます。

1. 2つの文字を比較する

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

2. 文字の大きさを判定する

ハイジは、ある文字が「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. 文字の大きさを変える

ハイジはときどき、文字を別の大きさに切り替える必要があります。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. 文字の種類を判定する

ハイジは、その文字がどんな種類なのかも知る必要があります。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
GitHubで編集する リンクは新しいウィンドウまたはタブで開きます
Factor Exercism

文字の研究を始める準備はできましたか?

Exercismに登録すれば、47個のコンセプト163個の演習、そして本物の人間によるメンタリングとともに、Factorを学んでマスターできます。すべて無料です。