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
}
A procedure pred must take as many arguments as the given ranges.
These are range version of filter
, remove
, and
filter-map
(see リストをたどる手続き).
The procedures without ->list
returns the result as a range,
while the ones with ->list
returns the result as a list.
The iteration stops when the shortest range is exhausted. The result is eagerly computed.
(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
}
These are range version of fold
and fold-right
(see リストをたどる手続き).
The iteration stops when the shortest range is exhausted.
[SRFI-196]{data.range
}
Returns the first or the last index of the element in the input range
that satisfies a predicate pred. If there are more than one
ranges, pred must take as many arguments as the number of input
ranges, and applied on each corresponding elements of the input range.
(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
}
Same as take-while
, take-while-right
, drop-while
,
and drop-while-right
, except those operate on an range
and return an range, instead of a list (see scheme.list
- R7RSリスト).
[SRFI-196]{data.range
}
Convert a range to a list, a vector ro a string, respectively.
For range->string
, the argument must be a range consists solely
of characters.
[SRFI-196]{data.range
}
Returns a range whose elements are those of a vector vec.
Unlike vector-range
, the content of vec is copied into
the range, so mutating vec won’t alter the resulting range.
The optional start and end arguments limit the portion to be used for the result.
[SRFI-196]{data.range
}
Returns a generator that yields each element of range,
between start (inclusive) and end (exclusive) indexes.
When omitted, start is 0 and end is the size of the range.