非公式チュートリアル11 文字および文字列のファンクション
2年ぶりの更新。
今回は文字および文字列の扱い方、およびそのファンクションを列挙してみる。リファレンスマニュアルに載っていないLISP由来のファンクションがたくさんあるので、是非ともご活用いただきたい。
OpenMusicで文字を扱う場合は、以下の3つに分けられる。
- 単一の文字からなる「文字 character (char)」
- 複数の文字からなる「文字列 string」
- 文字列をシンボルとみなす「シンボル symbol」
非公式Tutorial 04 omif subpatchで条件判断文によりevenとoddの文字を表示させたが、この時は「シンボル」という扱いであった。今回は「文字」と「文字列」を扱う。
単一の文字(半角英数字と記号)を扱うときには、 #\ の次に文字を書く。 a という文字を扱うなら #\a と書く。
複数の文字からなる文字列を扱うときには、文字列をダブルクォーテーションで囲む。ABCという文字列を扱うなら "ABC" と書く。
ダブルクォーテーションで囲まれていない文字列は、シンボルとして認識される。
シンボルとは、文字列のように扱えるが、予約語(LISPの命令としてすでに存在する単語)である場合、LISPの命令のように動く。例えば非公式チュートリアル4で出てきた evenp を使う場合、これをLISPのファンクション apply の左辺に入れると、 evenp のファンクションを繋いだのと同じ動きをする。
それに対して文字列は、その文字列の中のどれか1文字や一部の文字列を指定したり、文字列の評価(ABC順で前か後かなど)を行うことができる。
具体例はチュートリアルの次項で見ていくことにして、ここではまず最低限必要なファンクションを解説しよう。
名前がpで終わるファンクションは、評価のファンクションである。例えば非公式チュートリアル4でも evenp と oddp を扱った。これらの評価ファンクションは、omifに繋ぐことで、条件判断文として使うことができる。判断が真なら t を、偽なら nil を返す。
characterp 文字かどうかを判断する。
stringp 文字列かどうかを判断する。
arpha-char-p 文字がアルファベットかどうかを判断する。
alphanumericp 文字がアルファベットまたは数字かどうかを判断する。
code-char 数値を指定することで、そのアスキーコードに対応する文字を返す。
char-code 文字を指定することで、その文字に対応するアスキーコードを返す。
char= 左辺と右辺の文字が一致するかどうかを判断する。小文字と大文字を区別する。
char-equal 左辺と右辺の文字が一致するかどうかを判断する。小文字と大文字を区別しない。
lower-case 文字が小文字のアルファベットかどうかを判断する。
upper-case 文字が大文字のアルファベットかどうかを判断する。
aref, elt, char 文字列を左辺に指定した場合、いずれも右辺に指定した数値n番目の文字を返す。LISPは0からものを数えるので、先頭の文字は0となる。
length 今までのチュートリアルでも使ってきたファンクションだが、文字列を指定した場合、その長さを返す。
typep 左辺の入力が、右辺に指定されたタイプ(char, string, symbol)と一致するかどうかを判断する。
character 単一の文字を指定した場合、その文字を返す。
string 文字列を返す。ここで注意したいのは、単一の文字を指定しても、stringはそれを文字列として返す点である。つまり #\a をstringに指定すると、返り値は "a" となり、文字列とみなされる。
string= 左辺の文字列が右辺の文字列と一致するかどうかを判断する。小文字と大文字を区別する。
string-equal 左辺の文字列が右辺の文字列と一致するかどうかを判断する。小文字と大文字を区別しない。
string< 左辺の文字列が右辺の文字列より小さいかどうかを判断する。左辺が大きい場合はnilを返す。左辺が小さい場合、一致する文字列の数を返す。
- 左辺 abcde 右辺 abcce の場合、3文字目まではabcで同一だが、4文字目は左辺のd(アスキーコード100)より右辺のc(アスキーコード99)の方がアスキーコードが小さいので、判断はここで終了し、nilを返す。
- 左辺 abcde 右辺 abcee の場合、3文字目まではabcで同一だが、4文字目は左辺のd(アスキーコード100)より右辺のe(アスキーコード101)の方がアスキーコードが大きいので、判断はここで終了し、一致した文字数の合計3を返す。
string> 左辺の文字列が右辺の文字列より大きいかどうかを判断する。左辺が小さい場合はnilを返す。左辺が大きい場合、一致する文字列の数を返す。(判断の例は上記を参照)
string<= 左辺の文字列が右辺の文字列より小さいまたは同じかどうかを判断する。左辺が大きい場合はnilを返す。左辺が小さいまたは同じ場合、一致する文字列の数を返す。(判断の例は上記を参照)
string>= 左辺の文字列が右辺の文字列より大きいまたは同じかどうかを判断する。左辺が小さい場合はnilを返す。左辺が大きいまたは同じ場合、一致する文字列の数を返す。(判断の例は上記を参照)
string-upcase 文字列の小文字を大文字に変換する。
string-downcase 文字列の大文字を小文字に変換する。
char-upcase 文字の小文字を大文字に変換する。
char-downcase 文字の大文字を小文字に変換する。
princ-to-string 数値を文字列に変換する。
parse-integer 数字で構成された文字列を数値に変換する。
次回は文字列を使った実際のパッチ作例を見ていく。