For Development HEAD DRAFTSearch (procedure/syntax/module):

11.29 srfi.152 - 文字列ライブラリ(簡略版)

Module: 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特有の手続きについて説明します。

Function: string-remove pred string :optional start end

[SRFI.152]{srfi.152} stringstartendインデックス間から、 述語predを満たす文字を除いた部分文字列を返します。 (string-filter (complement pred) string start end)と同じです。

これはsrfi.13string-deleteと呼ばれていた手続きに相当します。 第一引数に述語手続きだけを取るようにし、また他のsrfiとの一貫性を重視して 名前が変えられました(例えばSRFI-1のfilterremovedeleteの 関係を考えてください)。

(string-remove char-whitespace?
               "Quick fox jumps over the lazy dog"
               3 22)
 ⇒ "ckfoxjumpsovert"
Function: string-replicate string from to :optional start end

[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

このソース文字列から、インデックスfromtoの間の部分文字列を取り出し返します。

(string-replicate "abcde" 2 10 1 4)
  ⇒ "dbcdbcdb"
(string-replicate "abcde" -5 -3 1 4)
  ⇒ "cdbcdbcd"
Function: string-segment string k

[SRFI-152]{srfi.152} stringk文字ごとに分割して、そのリストを返します。 最後の文字列はk文字より短いかもしれません。

(string-segment "abcdefghijklmn" 3)
 ⇒ ("abc" "def" "ghi" "jkl" "mn")

類似の手続きとして、slicesがあります。 (リストへのアクセスと変更参照)。

Function: string-contains-right string1 string2 :optional start1 end1 start2 end2

[SRFI-152]{srfi.152} string-containsと同様、 ソース文字列string1から探索文字列string2を探しますが、 見つかった場合は最初ではなく最後のマッチの開始インデックスを返します。 開始インデックスはstring1に対するものです。 省略可能引数はstring1string2それぞれの対象とする文字列を制限します。 探索文字列string2が見つからなかった場合は#fが返されます。

エッジケースとして、探索文字列が空文字列の場合 (string2が空であるとか、 start2 = end2である場合)は、 それは常にソース文字列の一番右端とマッチします。つまりend1が戻り値になります。

(string-contains-right "Little Lisper" "Li")
  ⇒ 7
Function: string-take-while string pred :optional start end
Function: string-take-while-right string pred :optional start end

[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遅延シーケンス)等とは逆であることに 注意してください。

Function: string-drop-while string pred :optional start end
Function: string-drop-while-right string pred :optional start end

[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遅延シーケンス)等とは逆であることに 注意してください。

Function: string-span string pred :optional start end
Function: string-break string pred :optional start end

[SRFI-152]{srfi.152} stringstartから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.listspanbreakと逆であることに注意 (scheme.list - R7RSリスト参照)。



For Development HEAD DRAFTSearch (procedure/syntax/module):
DRAFT