コメントで string という手続きを教えてもらった。
cf. 6.12 文字列 – Gauche ユーザリファレンス
gosh> (string #\a) "a"
これを使えば、昨日の string->string-list はこう書ける。
gosh> (define string->string-list (lambda (s) (map string (string->list s)))) string->string-list gosh> (string->string-list "abc") ("a" "b" "c")
うーん、上のページは目を通したはずなんだけど見落としてたよ。文字列を「変換する」方法ばかり探してたからかもしれない。文字列の構築子の項にちゃんと載ってた。
せっかくなので、文字列を作る方法について少しまとめておこう。
string char …
上でも書いたように、文字から文字列を作る。引数の文字は1つじゃなくてもいい。
gosh> (string #\a #\b #\c) "abc"
make-string k :optional char
長さ k の文字列を返す。char が与えられればそれで内容を満たすってあるけど、なかったらどうなるんだ?
gosh> (make-string 5 #\x) "xxxxx" gosh> (make-string 5) " "
なるほど、スペースが使われるのね。
make-byte-string k :optional byte
make-string に似てるけど、オプショナルな引数 byte は文字じゃなくて整数。
gosh> (make-byte-string 5) #*"\0\0\0\0\0" gosh> (make-byte-string 5 97) #*"aaaaa"
んむ、なんか見たことのない表現が出てきた。
x->stirng obj
文字列への強制型変換手続き。簡単に言うと obj を表示するときの文字列に変換される、ってことでいいのかな。
gosh> (x->string "abc") "abc" gosh> (x->string 123) "123" gosh> (x->string 'foo) "foo" gosh> (x->string '(1 2 3)) "(1 2 3)"
[追記]
コメントでは gauche.collection モジュールの map を使う方法も教えてもらったので、それも書いておこう。標準ライブラリの map はリストしか受け付けないけど、gauche.collection モジュールの map は文字列を含むコレクションにを受け付ける。なので、string->list を省略できる。
gosh> (use gauche.collection) #<undef> gosh> (define string->string-list (lambda (s) (map string s))) string->string-list gosh> (string->string-list "abc") ("a" "b" "c")