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
[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
[SRFI-130]{srfi.130
}
文字列haystackの中から部分文字列needleを探します。探索方向は、
string-contains
では左から右へstring-contains-right
では
右から左です。
SRFI-13の同名の手続きは、見つかった部分文字列の開始位置を整数インデックスで 返しますが、これらの手続きは文字列カーソルで返します。
haystackがneedle中に無ければ#f
が返されます。
[SRFI-130]{srfi.130
}
procをstring中の各文字列カーソル位置(左から右へ)を引数にして
順に呼び出します。ただし最後のカーソル(末尾文字の次の位置)についてはproc
を呼びません。
SRFI-13のstring-for-each-index
の文字列カーソル版です。
(define s "abc")
(string-for-each-cursor (^c (display (string-ref/cursor s c))) s)
⇒ displays abc