data.range - レンジ ¶レンジオブジェクトはO(1)で要素にアクセスでき、
そして各要素が手続き的に計算されるような不変なシーケンスです。
例えば、0からNまでの整数のレンジ、というのは、i番目の要素を計算する手続きが
identityであるようなレンジとして簡単に実現できるでしょう。
これは、全ての整数を持つシーケンスを作るよりずっと軽いです。
レンジはまた、一部分だけ取り出したレンジを作ったり、 レンジ同士をつなげたりする操作を効率的に行えます。
レンジオブジェクトはSRFI-42 先行評価的内包表記の:range qualifierに
渡すこともできます (srfi.42 - 先行評価的内包表記参照)。
ポータブルなレンジオブジェクトのインタフェースはsrfi.196で
規定されています。Gaucheではレンジオブジェクトを<sequence>として
実装し、シーケンスプロトコルも使えるようにしています
(gauche.sequence - シーケンスフレームワーク参照)。またこのモジュールではsrfi.196にない
手続きも提供されます。
レンジオブジェクトのクラスです。内部的には、異なるレンジの性質に合わせて
いくつかのサブクラスを使っていますが、外部的には全てのレンジを
<range>クラスのインスタンスとして扱って構いません。
<range>クラスのメタクラスです。
[SRFI-196]{data.range}
長さがlengthで、i番目の要素(0 <= i < length))
が(indexer i)で計算されるようなレンジを作って返します。
手続きindexerはO(1)の時間オーダーで動作し、参照透過でなければなりません。 実装によっては、内部で要素の値をフラットベクタにキャッシュすることもありえます。
(range->list (range 5 (^i (+ i 10)))) ⇒ (10 11 12 13 14)
[SRFI-196]{data.range}
startから始まり、stepごとに増加し、end未満で終わる数値のレンジを
作って返します。stepが省略された場合は1が使われます。
(range->list (numeric-range 2 6)) ⇒ (2 3 4 5) (range->list (numeric-range 0 5 2/3)) ⇒ (0 2/3 4/3 2 8/3 10/3 4 14/3)
[SRFI-196]{data.range}
長さがlengthで、startから始まりstepごとに増加する
数値のレンジを作って返します。start、stepの省略時の値は
それぞれ0と1です。
(range->list (iota-range 5)) ⇒ (0 1 2 3 4) (range->list (iota-range 7 1 -1/7)) ⇒ (1 6/7 5/7 4/7 3/7 2/7 1/7)
[SRFI-196+]{data.range}
ベクタvecにアクセスするレンジを作って返します。
ベクタはそのままレンジのデータ元として使われるので、
この後でvecを変更してはなりません。
下のvector->rangeも参照。
省略可能引数startとendはベクタの使う範囲のインデックスを制限します。 これらの引数はGaucheの独自拡張で、SRFI-196にはありません。
(range->list (vector-range '#(a b c))) ⇒ (a b c) (range->list (vector-range '#(a b c d e) 1 4)) ⇒ (b c d) (range-ref (vector-range '#(a b c d e) 2) 0)n ⇒ c
{data.range}
ユニフォームベクタuvecにアクセスするレンジを作って返します。
ユニフォームベクタはそのままレンジのデータ元として使われるので、
この後でuvecを変更してはなりません。
省略可能引数startとendはベクタの使う範囲のインデックスを制限します。
{data.range}
ビットベクタbvecにアクセスするレンジを作って返します。
bitvector/bool-rangeはbvecを真偽値のベクタ、
bitvector/int-rangeは0と1からなるベクタとみなします。
ビットベクタについて詳しくはSee ビットベクタを参照してください。
bvecはレンジオブジェクトの中から直接参照されるので、
後からbvecを変更してはなりません。
省略可能なstart、end引数はビットベクタのうち使われる範囲を制限します。
[SRFI-196]{data.range}
文字列strの各文字にアクセスするレンジを作って返します。
strはレンジオブジェクトから直接参照されるので、後でstrを変更してはなりません。
省略可能なstart、end引数は文字列のうち使われる範囲を制限します。 これはSRFI-196に対するGaucheの拡張です。
(range->list (string-range "abc")) ⇒ (#\a #\b #\c) (range->list (string-range "abcde" 1 4)) ⇒ (#\b #\c #\d)
[SRFI-196]{data.range}
与えられたレンジをつなぎ合わせたレンジを新たに作って返します。
[SRFI-196+]{data.range}
rangeの各要素を逆順にアクセスする新たなレンジを作って返します。
省略可能なstart、end引数はrangeのうち使われる範囲を制限します。 これはSRFI-196に対するGaucheの拡張です。
(range->list (range-reverse (string-range "abc"))) ⇒ (#\c #\b #\a) (range->list (range-reverse (string-range "abcdef" 1 4))) ⇒ (#\d #\c #\b)
[SRFI-196]{data.range}
objがレンジなら#tを、そうでなければ#fを返します。
[SRFI-196]{data.range}
与えられたレンジがすべて同じ長さで、
かつすべてのレンジのペアの対応する要素がelt=で比較して
等しい場合に#tを、そうでなければ#fを返します。
エッジケースとして、ゼロ個または一個のレンジが与えられた場合は無条件に#tを
返します。
(range=? eqv? (numeric-range 0 5)
(iota-range 5)
(vector-range '#(0 1 2 3 4)))
⇒ #t
[SRFI-196]{data.range}
rangeの長さを返します。
[SRFI-196+]{data.range}
rangeのi番目の要素を返します。iは正確な整数でなければなりません。
iが負、もしくはrangeの長さ以上だった場合、 fallbackが与えられていればそれが返され、そうでなければエラーが投げられます。 fallback引数はSRFI-196に対するGauchenの拡張です。
[SRFI-196+]{data.range}
それぞれ、rangeの最初および最後の要素を返します。
rangeが空の場合、 fallbackが与えられていればそれが返され、そうでなければエラーが投げられます。 fallback引数はSRFI-196に対するGaucheの拡張です。
[SRFI-196]{data.range}
元のレンジのうち、k番目より前の要素を含むレンジと、
k番目以降の要素を含むレンジを作って二つの値として返します。
[SRFI-196]{data.range}
Returns a new range that contains start-th (inclusive)
to end-th (exclusive) elements of range.
元のレンジのstart番目からend番目の手前の要素までを含む
レンジを作って返します。
[SRFI-196]{data.range}
rangeを、それぞれ長さlenのレンジに分割してそのリストを返します。
最後のレンジはlenより短いかもしれません。
(map range->list (range-segment (numeric-range 0 11) 4)) ⇒ ((0 1 2 3) (4 5 6 7) (8 9 10))
[SRFI-196]{data.range}
それぞれ、rangeの最初もしくは最後のcount個の要素を含むレンジを返します。
[SRFI-196]{data.range}
それぞれ、rangeの最初もしくは最後からcount個の要素を除いたレンジを返します。
[SRFI-196]{data.range}
predは引数のレンジの数と同じだけの引数を取る述語です。
各レンジの対応する要素を引数としてpredが呼ばれ、
それが真の値を返した回数を返します。
複数のレンジが与えられ、それらの長さが異なっていた場合、 繰り返しは最も短いレンジで止まります。
[SRFI-196]{data.range}
predは引数のレンジの数と同じだけの引数を取る手続きです。
各レンジの対応する要素を引数としてpredが順に呼ばれます。
predが真の値を返したら、繰り返しは打ち切られ、そのpredの戻り値が
返されます。predが全て#fを返した場合は#fが返されます。
複数のレンジが与えられ、それらの長さが異なっていた場合、 繰り返しは最も短いレンジで止まります。
[SRFI-196]{data.range}
predは引数のレンジの数と同じだけの引数を取る手続きです。
各レンジの対応する要素を引数としてpredが順に呼ばれます。
predが#fを返したら、繰り返しは打ち切られ、#fが返されます。
predが全て真の値を返した場合は、最後の値が戻り値となります。
複数のレンジが与えられ、それらの長さが異なっていた場合、 繰り返しは最も短いレンジで止まります。
[SRFI-196]{data.range}
レンジに対するmapです。
procは引数のレンジの数と同じだけの引数を取る手続きで、
各レンジの対応する要素を引数として呼び出されます。
結果は集められ、
それぞれレンジ(range-map)、リスト(range-map->list)、
ベクタ(range-map->vector) として返されます。
procが呼ばれる順番は規定されていません。
range-mapは全ての要素を計算してから結果を返します。
複数のレンジが与えられ、それらの長さが異なっていた場合、 繰り返しは最も短いレンジで止まります。
[SRFI-196]{data.range}
procは引数のレンジの数と同じだけの引数を取る手続きで、
各レンジの対応する要素を引数として順に呼び出されます。
繰り返しは最も短いレンジの末尾で止まります。procの結果は捨てられます。
戻り値は未定義です。
[SRFI-196]{data.range}
predは引数のレンジの数と同じだけの引数を取る手続きです。
これらの手続きはfilter、remove、filter-map
のレンジ版です (リストをたどる手続き参照)。
手続きに->listがついていないものは、結果をレンジで返します。
ついているものは結果をリストで返します。
繰り返しは最も短いレンジを使い切ったところで止まります。 結果は返される前に全て計算されます。
(range->list (range-filter odd? (iota-range 10))) ⇒ (1 3 5 7 9) (range-remove->list odd? (iota-range 10)) ⇒ (0 2 4 6 8) (range->list (range-filter-map (every-pred odd? square) (iota-range 10))) ⇒ (1 9 25 49 81)
[SRFI-196]{data.range}
fold、fold-rightのレンジ版です
(リストをたどる手続き参照)。
繰り返しは最も短いレンジを使い切ったところで止まります。
[SRFI-196]{data.range}
入力レンジの要素のうち、predを満たす最初もしくは最後の要素のインデックスを
返します。複数のレンジが与えられた場合はpredはそのレンジの数と同じだけ
引数を取り、各レンジから取ってきた要素が渡されます。
(range-index > (vector-range '#(1 5 3 2 4))
(vector-range '#(4 3 0 4 6)))
⇒ 1
(range-index-right > (vector-range '#(1 5 3 2 4))
(vector-range '#(4 3 0 4 6)))
⇒ 2
[SRFI-196]{data.range}
take-while、take-while-right、drop-while、
drop-while-rightのレンジ版です (scheme.list - R7RSリスト参照)。
[SRFI-196]{data.range}
レンジをそれぞれリスト、ベクタ、文字列に変換します。
range->stringに渡さえるレンジは文字だけで構成されていなければなりません。
[SRFI-196]{data.range}
ベクターvecの要素から構成されるレンジを返します。
vector-rangeと違ってvecの内容はレンジにコピーされるので、
この呼び出しの後でvecの内容を変更してもレンジに影響はありません。
省略可能なstartとend引数は入力ベクタのうち使われる範囲を制限します。
[SRFI-196]{data.range}
レンジrangeの、start (含む) から end (含まない) までの
要素をひとつづつ返すジェネレータを返します。
start、endが省略された場合はそれぞれ0とレンジのサイズが使われます。