Common Lispには、他のプログラミング言語と同じように文字があります。 文字は、テキスト(文字列やテキストストリームなど)を構成する1つの要素を表すオブジェクトです。
文字は整数との相互変換ができます。(ただし、文字は整数ではありません。独立した型です。)
文字は、#\に続けて名前を書いて表します。
'A'や'b'、'9'、'!'のような一般的な文字の「名前」は、その文字そのものです。つまり、#\A、#\b、#\9、#\!のように書きます。
スペースや改行などの非図形文字には、#\Spaceや#\Newlineのような名前が付いています。
標準では、実装が96文字(ラテン文字の大文字と小文字(A-Za-z)、数字(0-9)、スペース(#\Space)、改行(#\Newline)、句読点(例:!$"'(),_-./:;?+<=>#%&*@[\]{|}`^~))を備えていることだけを要求しています。
ただし、ほとんどの実装では、これよりも多くの文字を利用できます。すべてのUnicode文字をサポートする実装もあります。
文字が等しいかどうかは、char=またはchar-equalで比較できます(後者は大文字と小文字を区別しません)。
文字の順序は、char<、char>、char<=、char>=などの関数や、大文字と小文字を区別しないchar-lesspとchar-greaterpで比較できます。
文字は、図形文字、英字、英数字、数字、大文字、小文字など、さまざまな種類に分類できます。
1つの文字が複数の種類に当てはまることもあります。たとえば、大文字の英字はその一例です。
これらの種類にはそれぞれ述語があります。graphic-char-p、alpha-char-p、alphanumericp、digit-char-p、upper-case-p、lower-case-pです。
一部の文字は大文字と小文字があり、char-upcaseとchar-downcaseで相互に変換できます。
若いLispエイリアンのLewisは、人間のアルファベットのプロジェクトを進める必要があり、そこで必要になるいくつかの関数のプログラミングを手伝ってほしいと頼んできました。
Lewisは、2つの文字を比較する関数を必要としています。1つ目の文字が2つ目より大きいのか、小さいのか、等しいのかを判定するものです。
2つの文字を受け取り、大小関係に応じて:greater-than、:less-than、:equal-toのいずれかに評価されるcompare-charsという関数を書きましょう。
この関数は、大文字と小文字を区別して比較する必要があります。
Lewisは、ある文字が"big"(大文字)なのか、"little"(小文字)なのか、どちらでもなければ"no-size"なのかを知る必要があります。
文字の「サイズ」に応じて:big、:small、:no-sizeのいずれかに評価されるsize-of-charという関数を書きましょう:
Lewisは、大きな文字を小さくしたり、小さな文字を大きくしたりする必要があるかもしれません。
文字と、変えたいサイズ(:bigまたは:small)という2つの入力を受け取るchange-size-of-charという関数を書きましょう。
この関数は、指定したサイズに対応する文字に評価されます。
Lewisは、文字の「サイズ」だけでなく「種類」も知る必要があります。
type-of-charという関数を書きましょう。この関数は、文字が英字であれば:alpha、数字であれば:numeric、空白文字であれば:space、改行文字であれば:newline、それ以外であれば:unknownに評価されます。
Exercismに登録すれば、27個のコンセプト92個の演習、そして本物の人間によるメンタリングとともに、Common Lispを学んでマスターできます。すべて無料です。