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

11.28 srfi.130 - カーソルを使う文字列ライブラリ

Module: srfi.130

これはsrfi.13の縮小バージョンで、インデックスの箇所に文字列カーソルも 使えるようにしたものです。APIにはR7RSと最近のsrfiとの一貫性も考慮してあります。

Gaucheは文字列カーソルを組み込みでサポートしており(文字列カーソル参照)、 文字列インデックスを引数に取る組み込み手続きやSRFI-13手続きはインデックスの箇所に 文字列カーソルを渡すことができます。ただ、ポータブルなコードを書いている場合は、 このモジュールを明示的に使うのが良いでしょう。

以下の手続きは組み込みです。文字列カーソルを参照してください。

string-cursor?        string-cursor-start    string-cursor-end
string-cursor-next    strig-cursor-prev      string-cursor-forward
string-cursor-back    string-cursor=?        string-cursor<?
string-cursor<=?      string-cursor>?        string-cursor>=?
string-cursor-diff    string-cursor->index   string-index->cursor

以下の手続きは/cursor/cursorsサフィックスを除いた 組み込み手続きの単なる別名になっています。

string->list/cursors  string->vector/cursors string-copy/cursors
string-ref/cursor     substring/cursors

以下の手続きはSRFI-13で定義されています (srfi.13 - 文字列ライブラリ参照)。 SRFI-13でインデックスのみを受け取る手続きは、SRFI-130で インデックスと文字列カーソル両方を受け取るように拡張されています。 GaucheではSRFI-13とSRFI-130の手続きは同じコードを利用していて、 従って常にインデックスも文字列カーソルも使えますが、 SRFI-13としてインポートした手続きに文字列カーソルを渡すのはポータブルではありません。

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-concatenate string-concatenate-reverse            string-count
string-filter      string-reverse

以下の手続きは、整数インデックスを取る引数が文字列カーソルも取れるという点を除いて、 SRFI-152にあるものと同じです (srfi.152 - 文字列ライブラリ(簡略版)参照):

string-replicate   string-remove      string-split

以下の手続きはSRFI-13の同名の手続きと異なり、インデックスではなく文字列カーソルを返します。 以下で詳しく説明します。

string-index        string-index-right
string-skip         string-skip-right
string-contains     string-contains-right
Function: string-index string pred :optional start end
Function: string-index-right string pred :optional start end
Function: string-skip string pred :optional start end
Function: string-skip-right string pred :optional start end

[SRFI-130]{srfi.130} predを満たす(string-index/string-index-right) もしくは満たさない(string-skip/string-skip-right)最初の文字 の位置を返します。 string-index/string-skipは左から、 string-index-right/string-skip-rightは右から該当する文字を探します。

SRFI-13の同名の手続きが整数の文字インデックスを返すのに対し、 これらは文字列カーソルを返します。

string-indexが返すカーソルは、 predを満たす最も左の文字を指しています。 一方、string-index-rightが返すカーソルは、 predを満たす最も右の文字の次(一つ右)を指しています。 また、ひとつもpredを満たす文字が無かった場合、 string-indexは文字列の最後(最後の文字の次)を指すカーソルを、 string-index-rightは文字列の先頭を指すカーソルを返します。 (*-skipは条件が逆になるだけです)。

(この仕様は、カーソルが文字の「間」にあると考える方がわかりやすいかもしれません。 左から右に文字列を見て行く時は、カーソルは自分の右側の文字を見ます。 右から左に見て行く時は、自分の左側の文字を見ます。)

条件を満たす文字が無かった時にもカーソルが返されることに注意してください。 SRFI-13のバージョンではその場合は#fが返されていました。

省略可能なstart/end引数は文字列カーソルか整数の文字インデックスで、 探索領域を限定します。

(define *s* "abc def ghi")

(string-cursor->index *s* (string-index *s* char-whitespace?))
  ⇒ 3

(string-cursor->index *s* (string-index *s* char-whitespace? 4))
  ⇒ 7

(string-cursor->index *s* (string-index-right *s* char-whitespace?))
  ⇒ 8

(string-cursor->index *s* (string-index-right *s* char-whitespace? 0 7))
  ⇒ 4
Function: string-contains haystack needle :optional start1 end1 start2 end2
Function: string-contains-right haystack needle :optional start1 end1 start2 end2

[SRFI-130]{srfi.130} 文字列haystackの中から部分文字列needleを探します。探索方向は、 string-containsでは左から右へstring-contains-rightでは 右から左です。

SRFI-13の同名の手続きは、見つかった部分文字列の開始位置を整数インデックスで 返しますが、これらの手続きは文字列カーソルで返します。

haystackneedle中に無ければ#fが返されます。

Function: string-for-each-cursor proc string :optional start end

[SRFI-130]{srfi.130} procstring中の各文字列カーソル位置(左から右へ)を引数にして 順に呼び出します。ただし最後のカーソル(末尾文字の次の位置)についてはproc を呼びません。 SRFI-13のstring-for-each-indexの文字列カーソル版です。

(define s "abc")
(string-for-each-cursor (^c (display (string-ref/cursor s c))) s)
 ⇒ displays abc


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