srfi.152
- 文字列ライブラリ(簡略版) ¶これはsrfi.13
の改良版です。
srfi.13
から余分なものを取り除き、R7RSや最近のsrfiとの一貫性を
改善したもので、実際はsrfi.13
より小さくなっています。
以下に示す手続きは組み込みです。詳しくは文字列を参照してください。
string? make-string string string-length string->vector string->list vector->string list->string string-ref string-set! substring string-copy string=? string<? string<=? string>? string>=? string-append string-join string-split string-map string-for-each read-string write-string string-fill!
以下に示す手続きはUnicodeの文字列の大文字小文字変換を使うように定義されていて、
元はgauche.unicode
で提供されています。
説明はフルセットの大文字小文字変換を参照してください。
Gaucheの組み込みにも同名の手続きがありますが、それらは文字ごとに
大文字小文字変換を行うので、文字列としての大文字小文字変換とは異なります
(ドイツ語のエスツェット等)。
string-ci=? string-ci<? string-ci<=? string-ci>? string-ci>=?
以下に示す手続きはSRFI-13で定義されています。
説明はsrfi.13
- 文字列ライブラリを参照してください。
SRFI-13ではこれらの手続きのいくつかは、述語引数として手続きだけでなく文字集合や
文字を取ることができます(例: string-filter
)。
SRFI-152では手続きしか許していません。Gaucheの実装ではこれらの手続きは
SRFI-13のものと同じなのでSRFI-13のような使い方ができますが、
SRFI-152として移植性のあるコードを書く際には手続きだけを渡すように気をつけてください。
string-null? string-any string-every string-tabulate string-unfold string-unfold-right reverse-list->string string-take string-drop string-take-right string-drop-right string-pad string-pad-right string-trim string-trim-right string-trim-both string-replace string-prefix-length string-suffix-length string-prefix? string-suffix? string-index string-index-right string-skip string-skip-right string-contains string-concatenate string-concatenate-reverse string-fold string-fold-right string-count string-filter string-copy!
以降では、SRFI-152特有の手続きについて説明します。
[SRFI.152]{srfi.152
}
stringのstartとendインデックス間から、
述語predを満たす文字を除いた部分文字列を返します。
(string-filter (complement pred) string start end)
と同じです。
これはsrfi.13
でstring-deleteと呼ばれていた手続きに相当します。
第一引数に述語手続きだけを取るようにし、また他のsrfiとの一貫性を重視して
名前が変えられました(例えばSRFI-1のfilter
、remove
、delete
の
関係を考えてください)。
(string-remove char-whitespace? "Quick fox jumps over the lazy dog" 3 22) ⇒ "ckfoxjumpsovert"
[SRFI-152]{srfi.152
}
拡張版substringです。SRFI-13ではxsubstring
と呼ばれていましたが、
一貫性のため名前が変えられました。
stringのインデックスstartからendまでの部分文字列をとり、
それを両側に無限に繰り返した文字悦を考えます。
例えばstringが"abcde"
であり、startが1、endが4なら、
"bcd"
が無限に繰り替えされた文字列を考えます。この文字列がソース文字列となります。
b
がインデックスの起点です。
... b c d b c d b c d b c d b ... -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6
このソース文字列から、インデックスfromとtoの間の部分文字列を取り出し返します。
(string-replicate "abcde" 2 10 1 4) ⇒ "dbcdbcdb" (string-replicate "abcde" -5 -3 1 4) ⇒ "cdbcdbcd"
[SRFI-152]{srfi.152
}
stringをk文字ごとに分割して、そのリストを返します。
最後の文字列はk文字より短いかもしれません。
(string-segment "abcdefghijklmn" 3) ⇒ ("abc" "def" "ghi" "jkl" "mn")
類似の手続きとして、slices
があります。
(リストへのアクセスと変更参照)。
[SRFI-152]{srfi.152
}
string-contains
と同様、
ソース文字列string1から探索文字列string2を探しますが、
見つかった場合は最初ではなく最後のマッチの開始インデックスを返します。
開始インデックスはstring1に対するものです。
省略可能引数はstring1、string2それぞれの対象とする文字列を制限します。
探索文字列string2が見つからなかった場合は#f
が返されます。
エッジケースとして、探索文字列が空文字列の場合 (string2が空であるとか、 start2 = end2である場合)は、 それは常にソース文字列の一番右端とマッチします。つまりend1が戻り値になります。
(string-contains-right "Little Lisper" "Li") ⇒ 7
[SRFI-152]{srfi.152
}
stringから、全ての文字が述語predを満たすような最長のプレフィクスまたは
サフィックスを返します。
註: pred引数と対象とするオブジェクトの順序が、
他のtake-while
系手続き、
take-while
(scheme.list
- R7RSリスト)、
ideque-take-while
(scheme.ideque
- R7RS変更不可な両端キュー)、
lseq-take-while
(scheme.lseq
- R7RS遅延シーケンス)等とは逆であることに
注意してください。
[SRFI-152]{srfi.152
}
stringから、全ての文字が述語predを満たさないような最長のプレフィクスまたは
サフィックスを返します。
註: pred引数と対象とするオブジェクトの順序が、
他のdrop-while
系手続き、
drop-while
(scheme.list
- R7RSリスト)、
ideque-drop-while
(scheme.ideque
- R7RS変更不可な両端キュー)、
lseq-drop-while
(scheme.lseq
- R7RS遅延シーケンス)等とは逆であることに
注意してください。
[SRFI-152]{srfi.152
}
stringのstartからendまでの範囲のうち、
全ての文字が述語predを満たす、あるいは満たさないような最長のプレフィクスをみつけ、
そのプレフィクスと、残りの部分文字列を二つの値として返します。
(string-break "foo@example.com" (cut eqv? <> #\@)) ⇒ "foo" and "@example.com" (string-break "foo@example.com" (cut eqv? <> #\@) 1 10) ⇒ "oo" "@exampl" ;; Gaucheでは文字集合を述語手続きとしても使える (string-span "VAR_1 = $VAR_2" #[\w]) ⇒ "VAR_1" and " = $VAR_2"
pred引数とソースオブジェクトの順が、
scheme.list
のspan
、break
と逆であることに注意
(scheme.list
- R7RSリスト参照)。