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

12.21 data.range - レンジ

Module: data.range

レンジオブジェクトはO(1)で要素にアクセスでき、 そして各要素が手続き的に計算されるような不変なシーケンスです。 例えば、0からNまでの整数のレンジ、というのは、i番目の要素を計算する手続きが identityであるようなレンジとして簡単に実現できるでしょう。 これは、全ての整数を持つシーケンスを作るよりずっと軽いです。

レンジはまた、一部分だけ取り出したレンジを作ったり、 レンジ同士をつなげたりする操作を効率的に行えます。

レンジオブジェクトはSRFI-42 先行評価的内包表記の:range qualifierに 渡すこともできます (srfi.42 - 先行評価的内包表記参照)。

ポータブルなレンジオブジェクトのインタフェースはsrfi.196で 規定されています。Gaucheではレンジオブジェクトを<sequence>として 実装し、シーケンスプロトコルも使えるようにしています (gauche.sequence - シーケンスフレームワーク参照)。またこのモジュールではsrfi.196にない 手続きも提供されます。

クラス

Class: <range>

レンジオブジェクトのクラスです。内部的には、異なるレンジの性質に合わせて いくつかのサブクラスを使っていますが、外部的には全てのレンジを <range>クラスのインスタンスとして扱って構いません。

Class: <range-meta>

<range>クラスのメタクラスです。

コンストラクタ

Function: range length indexer

[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)
Function: numeric-range start end :optional step

[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)
Function: iota-range length :optional start step

[SRFI-196]{data.range} 長さがlengthで、startから始まりstepごとに増加する 数値のレンジを作って返します。startstepの省略時の値は それぞれ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)
Function: vector-range vec :optional start end

[SRFI-196+]{data.range} ベクタvecにアクセスするレンジを作って返します。 ベクタはそのままレンジのデータ元として使われるので、 この後でvecを変更してはなりません。 下のvector->rangeも参照。

省略可能引数startendはベクタの使う範囲のインデックスを制限します。 これらの引数は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
Function: uvector-range uvec :optional start end

{data.range} ユニフォームベクタuvecにアクセスするレンジを作って返します。 ユニフォームベクタはそのままレンジのデータ元として使われるので、 この後でuvecを変更してはなりません。

省略可能引数startendはベクタの使う範囲のインデックスを制限します。

Function: bitvector/bool-range bvec :optional start end
Function: bitvector/int-range bvec :optional start end

{data.range} ビットベクタbvecにアクセスするレンジを作って返します。 bitvector/bool-rangebvecを真偽値のベクタ、 bitvector/int-rangeは0と1からなるベクタとみなします。 ビットベクタについて詳しくはSee ビットベクタを参照してください。 bvecはレンジオブジェクトの中から直接参照されるので、 後からbvecを変更してはなりません。

省略可能なstartend引数はビットベクタのうち使われる範囲を制限します。

Function: string-range str :optional start end

[SRFI-196]{data.range} 文字列strの各文字にアクセスするレンジを作って返します。 strはレンジオブジェクトから直接参照されるので、後でstrを変更してはなりません。

省略可能なstartend引数は文字列のうち使われる範囲を制限します。 これはSRFI-196に対するGaucheの拡張です。

(range->list (string-range "abc"))
  ⇒ (#\a #\b #\c)

(range->list (string-range "abcde" 1 4))
  ⇒ (#\b #\c #\d)
Function: range-append range …

[SRFI-196]{data.range} 与えられたレンジをつなぎ合わせたレンジを新たに作って返します。

Function: range-reverse range :optional start end

[SRFI-196+]{data.range} rangeの各要素を逆順にアクセスする新たなレンジを作って返します。

省略可能なstartend引数は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)

述語

Function: range? obj

[SRFI-196]{data.range} objがレンジなら#tを、そうでなければ#fを返します。

Function: range=? elt= range …

[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

アクセサ

Function: range-length range

[SRFI-196]{data.range} rangeの長さを返します。

Function: range-ref range i :optional fallback

[SRFI-196+]{data.range} rangei番目の要素を返します。iは正確な整数でなければなりません。

iが負、もしくはrangeの長さ以上だった場合、 fallbackが与えられていればそれが返され、そうでなければエラーが投げられます。 fallback引数はSRFI-196に対するGauchenの拡張です。

Function: range-first range :optional fallback
Function: range-last range :optional fallback

[SRFI-196+]{data.range} それぞれ、rangeの最初および最後の要素を返します。

rangeが空の場合、 fallbackが与えられていればそれが返され、そうでなければエラーが投げられます。 fallback引数はSRFI-196に対するGaucheの拡張です。

繰り返し

Function: range-split-at range k

[SRFI-196]{data.range} 元のレンジのうち、k番目より前の要素を含むレンジと、 k番目以降の要素を含むレンジを作って二つの値として返します。

Function: subrange range start end

[SRFI-196]{data.range} Returns a new range that contains start-th (inclusive) to end-th (exclusive) elements of range. 元のレンジのstart番目からend番目の手前の要素までを含む レンジを作って返します。

Function: range-segment range len

[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))
Function: range-take range count
Function: range-take-right range count

[SRFI-196]{data.range} それぞれ、rangeの最初もしくは最後のcount個の要素を含むレンジを返します。

Function: range-drop range count
Function: range-drop-range range count

[SRFI-196]{data.range} それぞれ、rangeの最初もしくは最後からcount個の要素を除いたレンジを返します。

Function: range-count pred range range2 …

[SRFI-196]{data.range} predは引数のレンジの数と同じだけの引数を取る述語です。 各レンジの対応する要素を引数としてpredが呼ばれ、 それが真の値を返した回数を返します。

複数のレンジが与えられ、それらの長さが異なっていた場合、 繰り返しは最も短いレンジで止まります。

Function: range-any pred range range2 …

[SRFI-196]{data.range} predは引数のレンジの数と同じだけの引数を取る手続きです。 各レンジの対応する要素を引数としてpredが順に呼ばれます。 predが真の値を返したら、繰り返しは打ち切られ、そのpredの戻り値が 返されます。predが全て#fを返した場合は#fが返されます。

複数のレンジが与えられ、それらの長さが異なっていた場合、 繰り返しは最も短いレンジで止まります。

Function: range-every pred range range2 …

[SRFI-196]{data.range} predは引数のレンジの数と同じだけの引数を取る手続きです。 各レンジの対応する要素を引数としてpredが順に呼ばれます。 pred#fを返したら、繰り返しは打ち切られ、#fが返されます。 predが全て真の値を返した場合は、最後の値が戻り値となります。

複数のレンジが与えられ、それらの長さが異なっていた場合、 繰り返しは最も短いレンジで止まります。

Function: range-map proc range range2 …
Function: range-map->list proc range range2 …
Function: range-map->vector proc range range2 …

[SRFI-196]{data.range} レンジに対するmapです。 procは引数のレンジの数と同じだけの引数を取る手続きで、 各レンジの対応する要素を引数として呼び出されます。 結果は集められ、 それぞれレンジ(range-map)、リスト(range-map->list)、 ベクタ(range-map->vector) として返されます。 procが呼ばれる順番は規定されていません。 range-mapは全ての要素を計算してから結果を返します。

複数のレンジが与えられ、それらの長さが異なっていた場合、 繰り返しは最も短いレンジで止まります。

Function: range-for-each proc range range2 …

[SRFI-196]{data.range} procは引数のレンジの数と同じだけの引数を取る手続きで、 各レンジの対応する要素を引数として順に呼び出されます。 繰り返しは最も短いレンジの末尾で止まります。procの結果は捨てられます。

戻り値は未定義です。

Function: range-filter pred range
Function: range-filter->list pred range
Function: range-remove pred range
Function: range-remove->list pred range
Function: range-filter-map pred range range2 …
Function: range-filter-map->list pred range range2 …

[SRFI-196]{data.range} predは引数のレンジの数と同じだけの引数を取る手続きです。 これらの手続きはfilterremovefilter-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)
Function: range-fold kons knil range range2 …
Function: range-fold-right kons knil range range2 …

[SRFI-196]{data.range} foldfold-rightのレンジ版です (リストをたどる手続き参照)。 繰り返しは最も短いレンジを使い切ったところで止まります。

検索

Function: range-index pred range range2 …
Function: range-index-right pred range range2 …

[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
Function: range-take-while pred range
Function: range-take-while-right pred range
Function: range-drop-while pred range
Function: range-drop-while-right pred range

[SRFI-196]{data.range} take-whiletake-while-rightdrop-whiledrop-while-rightのレンジ版です (scheme.list - R7RSリスト参照)。

変換

Function: range->list range
Function: range->vector range
Function: range->string range

[SRFI-196]{data.range} レンジをそれぞれリスト、ベクタ、文字列に変換します。 range->stringに渡さえるレンジは文字だけで構成されていなければなりません。

Function: vector->range vec :optional start end

[SRFI-196]{data.range} ベクターvecの要素から構成されるレンジを返します。 vector-rangeと違ってvecの内容はレンジにコピーされるので、 この呼び出しの後でvecの内容を変更してもレンジに影響はありません。

省略可能なstartend引数は入力ベクタのうち使われる範囲を制限します。

Function: range->generator range :optional start end

[SRFI-196]{data.range} レンジrangeの、start (含む) から end (含まない) までの 要素をひとつづつ返すジェネレータを返します。 startendが省略された場合はそれぞれ0とレンジのサイズが使われます。



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