文字のリストにするのには string->list が使える。
gosh> (string->list "abc") (#\a #\b #\c)
でも今日欲しいのは文字のリストじゃなくて、文字列(長さ1)のリストだ。例えば Ruby ではこう書ける。
2.1.1 :001 > "abc".split(//) => ["a", "b", "c"]
空(?)の正規表現で分割すると1文字ずつの配列になる。Ruby じゃ定番だね。
で、Scheme。string-split が正規表現も受け付けてくれるというので、上と同じように試したらダメだった。
gosh> (string-split "abc" #//) *** ERROR: string-split: splitter must not match a null string: #// Stack Trace: _______________________________________ 0 (error "string-split: splitter must not match a null string:" spli ... At line 58 of "/usr/share/gauche-0.9/0.9.3.3/lib/gauche/stringutil.scm" 1 scanner
結局こういうのふうに書いてみたけど、なんかスマートじゃない。
gosh> (define string->string-list (lambda (s) (map (lambda (c) (list->string (list c))) (string->list s)))) string->string-list gosh> (string->string-list "abc") ("a" "b" "c")
文字から長さ1の文字列へ変換する手続きが見当たらないんだよな。需要がないのかな。
これでいいと思います。
(define (string->string-list s)
(map string (string->list s)))
Gauche の機能では、コレクションフレームワークによって map は文字列型も含むいくつかの型でも使えるように拡張されているので gauche.collection をロードすれば string->list は省略してしまうことも出来ます。
(use gauche.collection)
(define (string->string-list s)
(map string s))