カーソルを 1 文字先に移動します (f は forward character の f)
1. 場合 2-1: (car s) が数値データの場合
6.1 さまざまなデータ型 ( その 2)
6.1.1 文字
文字
(character)
は文字通り、A や 6 などの「文字」を表すデータ型です。Scheme
プログラム中で文字データは、たとえば #\A
(
大文字のA)
とか、#\b(
小文字のb)
のように、#\h文字i または #\h文字の名前iといった形式で書かれます。
#\h文字iの形式での、文字データの例を見てみましょう。
> #\A
#\A#<unspecified>
> #\b
#\b#<unspecified>
> (display #\A) A#<unspecified>
> (display #\b) b#<unspecified>
この例で分かるように、文字データは自己評価的です。
117
次は #\h文字の名前i の例を見てみましょう。なおh文字の名前iによる文字の表し方 では、空白文字や改行文字などの制御文字
(control character)
を表すのに使います1。たとえば #\space は、空白文字を表します。
> (display #\space)
#<unspecified>
> (display #\tab)
#<unspecified>
> (display #\del)
^?#<unspecified>
> (display #\bel)
^G#<unspecified>
ASCII
文字集合での制御文字の一覧を、Appendix A
に掲げたので参考にして下さい。#\h文字iの 形式で 文字を 指定する場合には 大文字と 小文字の 区別は あ り ますが 、
#\h文字の名前iの場合には大文字
/
小文字は関係ありません。> (equal? #\A #\A)
#t
> (equal? #\A #\a)
#f
> (equal? #\tab #\tab)
#t
> (equal? #\tab #\TAB)
#t
> (equal? #\tab #\TaB)
#t
それぞれの文字には、その文字を表す整数が割り当てられています。
ASCII
文字集合の場合では、文字
A
には(10
進数で) 65
が割り当てられています2。文字に割り当てられた 整数のことを、その文字の文字コード(character code)
といいます。文字コード に関連し た手続きには、以下のものがあります。} (char->integer h文字i)
|
h文字iの文字コード を返します。1制御文字とは、
A
やz
のように文字そのものを表すのではなく、カーソルを次の行に移動させたり、画 面の表示を消去するといった、カーソルや画面などを制御するためのものです。制御文字は普通の文字のよ うに入力できないので、名前や文字コード(Appendix A
参照)
によって文字を指定します。2文字とそれにどの整数を割り当てるかを表にしたものが 、文字集合
(character set)
です。ASCII
文字集合や
EBCDIC
文字集合は代表的な文字集合です。} (integer->char h文字コード i)
|
h文字コード i の文字を返します。次に、文字と文字との比較について説明します。文字と文字の間には順序が付けられて いて、この順序に従って大小関係が決められています。たとえば 、A は B よりも小さい、
となっています。文字と文字との比較のための手続きには、次のものが用意されています。
なお、名前の最後に -ci の付いた手続きは 、大文字と小文字の区別をせずに比較をしま す3。
} (char=? h文字1i h文字2i)
|
h文字1i=
h文字2iか?
} (char<? h文字1i h文字2i)
|
h文字1i<
h文字2iか?
} (char>? h文字1i h文字2i)
|
h文字1i>
h文字2iか?
} (char<=? h文字1i h文字2i)
|
h文字1ih文字2iか?
} (char>=? h文字1i h文字2i)
|
h文字1ih文字2iか?
} (char-ci=? h文字1i h文字2i)
|
h文字1i=
h文字2iか?
} (char-ci<? h文字1i h文字2i)
|
h文字1i<
h文字2iか?
} (char-ci>? h文字1i h文字2i)
|
h文字1i>
h文字2iか?
} (char-ci<=? h文字1i h文字2i)
|
h文字1ih文字2iか?
} (char-ci>=? h文字1i h文字2i)
|
h文字1ih文字2iか?
では、これらの実行例を見てみましょう。
3-ciは、
case insensitive
の略で、大文字/
小文字の違いは気にしない、という意味です。> (char=? #\A #\A)
#t
> (char=? #\A #\a)
#f
> (char-ci=? #\A #\a)
#t
> (char<? #\G #\H)
#t
> (char<? #\G #\G)
#f
> (char>? #\5 #\8)
#t
与えられたデータが文字型かど うかを調べるには、手続きchar?を使います。
} (char? hデータi
|
hデータiの値が文字データなら真 #t を、そうでなければ偽 #f を返します。> (char? #\A)
#t
> (char? "A")
#f
文字は、 数字とかアルファベット文字とかのいくつかのグループに分かれています。文 字がどのグループに属するかを調べる手続きも用意されています。
} (char-alphabetic? h文字i)
|
h文字iはアルファベット文字か?
} (char-numeric? h文字i)
|
h文字iは数字か?
数字とは、0,
1,...,
9 をいいます。} (char-whitespace? h文字i)
|
h文字iは空白文字か?
空白文字とは、(ASCII
文字集合の場合)
スペース(space)
、タブ
(tab)
、改行(line feed)
、改頁(form feed)
、復改(carriage return)
のことをいいます。
} (char-upper-case? h文字i)
|
h文字iは大文字か?
} (char-lower-case? h文字i)
|
h文字iは小文字か?
実行例を以下に示します。
> (char-alphabetic? #\b)
#t
> (char-alphabetic? #\4)
#f
> (char-number? #\z)
#f
> (char-number? #\0)
#t
> (char-whitespace? #\space)
#t
> (char-whitespace? #\tab)
#t
> (char-upper-case? #\A)
#t
> (char-upper-case? #\b)
#f
> (char-lower-case? #\A)
#f
> (char-lower-case? #\z)
#t
大文字から小文字に、あるいはその逆を行なうには、次の手続きを使います。
} (char-upcase h文字i)
|
h文字iを大文字に変換します4。} (char-downcase h文字i) h文字iを小文字に変換します5。
文字を表示するには、手続き display と write を使います。 この他、write-char を 使って文字を表示することもできます。
> (write-char #\9) 9#<unspecified>
> (write-char #\newline)
#<unspecified>
4;5これらの手続きにおいて、h文字iは必ずしもアルファベット文字である必要はありません。h文字iが アルファベット文字のときに大文字または小文字に変換し 、それ以外のときはh文字iをそのまま返します。
文字と文字列との橋渡しをする手続きとして、以下の
2
つが用意されています。} (list->string h文字のリストi)
|
h文字のリストi を、文字列にします。} (string->list h文字列i)
|
h文字列iを、文字のリストにします。実行例を見てみましょう。
> (list->string (list #\p #\o #\o #\h))
"pooh"
> (list->string '())
""
> (string->list "owl") (#\o #\w #\l)