Chapter 2 データ型 - 2.2 合成データ型 - 2.2.1 文字列

今日から合成データ型ですってよ。文字列は文字のガッチンコみたいですよ。


文字列:

gosh> "Hello, World!"
"Hello, World!"

世はなべて事もなし


文字から文字列を合成するには string という関数を使う:

gosh> (string #\H #\e #\l #\l #\o)
"Hello"

一応やっておこう:

gosh> (string "He" #\l #\l #\o)
*** ERROR: character required, but got "He"
Stack Trace:
_______________________________________

はい、文字列は引数にとれません。


グローバル変数を作って、

gosh> (define greeting "Hello; Hello!")
greeting
gosh> greeting
"Hello; Hello!"

インデックスアクセス:

gosh> (string-ref greeting 0)
#\H
gosh> (string-ref greeting 1)
#\e

別にグローバル変数じゃなくてもいんじゃね?

gosh> (string-ref "Hello" 2)
#\l

ん? Ruby の文字列はインデックスアクセスしたら数値を返すけど(この仕様嫌い……)、Scheme はそのまま使えるのかな?

gosh> (display (string-ref "Hello" 0))
H#<undef>

だよね。使えるよね。文字型だもの。


文字列連結。複数の文字列から単一の文字列を合成と言うべきか:

gosh> (string-append "E "
                     "Pluribus "
                     "Unum")
"E Pluribus Unum"

ktkr! 全国の月刊ムーファンの皆様お待たせしました!「多から一へ」ですよ! 秘儀っぽい! SICP の表紙と合ってる!
# ktkr の脳内略語はまだ思いつきません(TODO)。

計算機プログラムの構造と解釈計算機プログラムの構造と解釈

文字列と文字の連結はどうかな?:

gosh> (string-append "Hell" #\o)
*** ERROR: string required, but got #\o

Stack Trace:
_______________________________________

だめかーww

gosh> (string-append "Hell" (string #\o))
"Hello"

ポリモーフィズムが欲しい気もすぃ。display ってポリモーフィズムの粉がかかってるよね?


長さ指定で文字列を作れる。作ったものが可変だったら固定長の意味ないようなあるような。高速化に使うの?

gosh> (define a-3-char-long-string (make-string 3))
a-3-char-long-string

中身は何だろ?:

gosh> a-3-char-long-string
"   "

な、半角スペースで埋めるの? いいの?これ? nil みたいなので埋めるかなぁと思ったけど。うん、いいか。実用的に。

gosh> (define hello (string #\H #\e #\l #\l #\o))
hello
gosh> hello
"Hello"
gosh> (string-set! hello 1 #\a)
#<undef>
gosh> hello
"Hallo"

(string-set! 文字列 インデックス 文字) で文字列のインデックス番目の要素を文字で上書きね。


今日はここまで。