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

11.41 srfi.185 - 線形更新な可変長文字列

Module: srfi.185

このモジュールはstring-appendstring-replaceの線形更新版を提供します。 「線形更新」とは、この関数を呼び出した後は引数が使われないことが前提になっているという 意味で、従って処理系は結果を格納するために引数を破壊的に再利用することが許されています。

しかしGaucheでは、文字列は変更不可な文字列本体へのポインタであって、 文字列の変更は新たな文字列本体を作ってポインタを差し替える操作にすぎず、 文字列を破壊的に再利用するメリットは全くありません。 従ってこのsrfiのAPIは単に非破壊版を呼び出すだけになっています。

このモジュールはまた、srfi.118の手続き(srfi.118 - 簡単な可変長文字列参照) と同名のマクロを提供しています。マクロは結果を引数に渡された式に set!する式に展開されるので、一見srfi.118と同じように使うことができます。

Function: string-append-linear! dst str-or-char …

[SRFI-185]{srfi.185} 文字列dstと他の引数を全部つなげた文字列を返します。 2番目以降の引数は文字でも文字列でも構いません。呼び出し元は、この関数を読んだ後は dstが指す文字列にアクセスしてはいけません。実装はdstが指す文字列を 破壊的に再利用して結果を格納することが許されています。Gaucheはdstを 破壊しませんが、ポータブルなコードではdstを使わないようにしてください。

dstが破壊することをあてにしてはいけません。 常に戻り値の文字列を使うようにしてください。

(string-append-linear! "abc" "def" #\g "hij")
  ⇒ "abcdefghij"
Function: stirng-replace-linear! dst dst-start dst-end src :optional src-start src-end

[SRFI-185]{srfi.185} 文字列dstのうち、dst-start(含まれる)からdst-end(含まれない) までの範囲を、文字列src(のsrc-startsrc-endの範囲)で置き換えた 文字列を返します。 呼び出し元は、この関数を読んだ後は dstが指す文字列にアクセスしてはいけません。実装はdstが指す文字列を 破壊的に再利用して結果を格納することが許されています。Gaucheはdstを 破壊しませんが、ポータブルなコードではdstを使わないようにしてください。

Gaucheでは、dst-startdst-endsrc-startsrc-end 引数に、整数の文字インデックスだけでなく文字列カーソルも使えます。 (文字列カーソル参照)。

Macro: string-append! dst string-or-char …
Macro: string-replace! dst dst-start dst-end src :optional src-start src-end

[SRFI-185]{srfi.185} これらのマクロは次の形に展開されます。

(set! dst (string-append-linear! dst string-or-char ...))

(set! dst (string-replace-linear! dst dst-start dst-end src src-start src-end))

つまり、呼び出した後にdstに変更された文字列が格納されることを想定している 箇所に使えます。Gaucheは一般化されたset!を持っているので、 dstにはセッターが定義されている手続き呼び出しも使えます。

(define x (list (string-copy "abc")))

(string-append! (car x) #\d #\e #\f)

x ⇒ ("abcdef")

SRFI-118 (srfi.118 - 簡単な可変長文字列参照)を使っているコードは、 このマクロで置き換えられることも多いでしょう。



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