text.gap-buffer
- ギャップバッファ ¶ギャップバッファは、編集可能なテキストを実装するのに便利なデータ構造です。
ギャップバッファは、「カーソル」を持つ文字のベクタと考えることができます。 カーソル位置への文字の挿入、もしくはカーソル位置の文字の削除はO(1)時間でできます。 ほとんどの編集APIは現在のカーソル位置を対象にします。
{text.gap-buffer
}
新たなギャップバッファを作って返します。初期状態では中身は空です。
キーワード引数initial-capacityは、正の正確な整数でなければならず、 初期状態のバッファの大きさを指定します。バッファは必要に応じて自動的に拡張されるので、 この引数は単なるヒントです。例えば最初に大きな文字列を挿入することがわかっていれば、 あらかじめ大きなバッファを取っておくことで再アロケーションのオーバヘッドを避けることが できます。
{text.gap-buffer
}
与えられた文字列stringを保持するギャップバッファを作って返します。
カーソルの初期位置は、デフォルトでは文字列の最後です。
posとwhence引数で初期位置を変更することができます。
whenceはシンボルbeginning
かend
で、posは
whenceからのオフセットを表す正確な整数です。例えばposが10で
whenceがbeginning
なら、文字列の先頭から10番目の文字にカーソルが
置かれます。posが-1でwhenceがend
なら、文字列の最後から
ひとつ手前の文字にカーソルが置かれます。posとwhenceの組み合わせが
文字列をはみ出してしまう場合はエラーが投げられます。
省略可能なstartとend引数は、ギャップバッファを作る前に 入力文字列の範囲を制限します。
{text.gap-buffer
}
objがギャップバッファなら#t
を、そうでなければ#f
を返します。
{text.gap-buffer
}
ギャップバッファgbufの新たなコピーを作って返します。内容およびカーソル位置は
gbufと同じになります。
{text.gap-buffer
}
ギャップバッファgbufの内容を文字列もしくは文字のジェネレータとして取り出します。
省略可能なstartとendはバッファ内の文字インデックスを指定する非負の正確な整数で、
取り出す内容の範囲を制限します。
返ってきたジェネレータを最後まで読む前にギャップバッファの内容を変えた場合、 一貫性のある振る舞いは保証されません。
{text.gap-buffer
}
ギャップバッファgbufの現在のカーソル位置を非負の正確な整数で返します。
{text.gap-buffer
}
位置を表す非負整数posがギャップバッファgbufの末尾を差していれば#t
を、
そうでなければ#f
を返します。
{text.gap-buffer
}
ギャップバッファgbufに現在アロケートされているストレージの大きさを
文字数で返します。gbufに格納する文字がそれを越えたら、ストレージは自動的に拡張されます。
{text.gap-buffer
}
ギャップバッファgbufに現在格納されている内容の大きさを、文字数で返します。
{text.gap-buffer
}
whence引数はシンボルbeginning
かend
のいずれかです。
ギャップバッファgbufの現在のカーソル位置がそれぞれバッファの先頭または末尾
である場合に#t
,をそうでなければ#f
を返します。
{text.gap-buffer
}
ギャップバッファgbufのindex番目の文字を返します。indexが
範囲外の場合、fallbackが与えられればそれを返し、無ければエラーが投げられます。
{text.gap-buffer
}
ギャップバッファgbufのindex番目の文字をcharで置き換えます。
indexが範囲外の場合はエラーが投げられます。
{text.gap-buffer
}
gbufのカーソル位置をposに移動します。posは正確な整数でなければなりません。
posはwhenceからの相対位置と解釈されます。whenceは
シンボルbeginning
、current
、end
のいずれかです。
省略された場合はbeginning
と同等です。
{text.gap-buffer
}
contentは文字または文字列です。contentwおgbufの
現在のカーソル位置に挿入します。
カーソルは、挿入された内容の末尾へと移動します。
{text.gap-buffer
}
gbufの現在のカーソル位置からsize文字を削除します。
sizeは非負の正確な整数でなければなりません。
sizeが現在の内容を越えてしまう場合はエラーとなります。
{text.gap-buffer
}
gbufを空にします。
{text.gap-buffer
}
これは(gap-buffer-delete! gbuf size)
と
(gap-buffer-insert! gbuf content)
を続けて実行するのと同じです。
sizeは非負の正確な整数でなければならず、
contentは文字か文字列でなければなりません。
{text.gap-buffer
}
文字列strをギャップバッファgbufの中から探します。
見つかったら、その先頭の文字インデックスを返します。
見つからなかったら#f
を返します。
省略可能引数startとgendは、gbuf内で検索すべき範囲を
制限する整数インデックスです。デフォルトではバッファ全体が検索対象となります。
#f
を渡すことでデフォルトの動作とすることができます。
省略可能引数sstartとsendは、strから
検索文字列を切り出す整数インデックスです。
#f
を渡すことでデフォルトの動作とすることができます。
{text.gap-buffer
}
整数インデックスpoint以降の内容の先頭が文字列strと一致する場合に
#t
を、そうでなければ#f
を返します。
pointが#f
か省略された場合は現在のカーソル位置が使われます。
{text.gap-buffer
}
これはギャップバッファgbufに対する編集を「リプレイ」するのに便利な手続きです。
edit-command引数は、次のいずれかの形のフォームです。
(i pos string)
stringをpos位置に挿入 (<b>I</b>nsert)。
(d pos length)
pos位置からlengthj文字を削除 (<b>D</b>elete)。
(c pos length string)
pos位置からのlength文字をstringへと変更 (<b>C</b>hange)。
ただし、posはバッファ先頭からの文字位置を示す非負の正確な整数です。
この手続きは、加えた変更を元に戻す編集コマンドを返します。
この手続きの使用場面のひとつは、undo/redoリストの処理です。
(define buf (string->gap-buffer "Hello, World!")) (gap-buffer-edit! buf '(d 0 5)) ⇒ (i 0 "Hello") (gap-buffer-edit! buf '(i 0 "Konnichiwa")) ⇒ (d 0 10) (gap-buffer->string buf) ⇒ "Aloha, World!" ;; gap-buffer-edit!の戻り値を逆順に適用すると元に戻せる (for-each (cut gap-buffer-edit! buf <>) '((d 0 10) (i 0 "Hello"))) (gap-buffer->string buf) ⇒ "Hello, World!"