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
}
Returns a range over the given bitvector bvec.
Bitvector/bool-range
regards bvec as a boolean vector,
while bitvector/int-range
regards it as a vector of 0 and 1.
See ビットベクタ, for the details of bitvectors.
Note that bvec is kept in the range, so you shouldn’t mutate uvec.
The optional start and end arguments limits the range of the uniorm vector to be used.
[SRFI-196]{data.range
}
Returns a range over each character in the given string str.
The string is kept in the range, so you shouldn’t mutate str.
The optional start and end arguments limits the range of the vector to be used. They are Gauche’s extension and not in SRFI-196.
(range->list (string-range "abc")) ⇒ (#\a #\b #\c) (range->list (string-range "abcde" 1 4)) ⇒ (#\b #\c #\d)
[SRFI-196]{data.range
}
Returns a new range that walks over concatenation of the given ranges.
[SRFI-196+]{data.range
}
Returns a new range that walks over the elements of range, but
in reverse order.
The optional start and end arguments limits the range of the vector to be used. They are Gauche’s extension and not in SRFI-196.
(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
}
Returns true iff obj is a range.
[SRFI-196]{data.range
}
Returns true iff all ranges have the same length, and any pair
of corresponding elements in the given ranges are equal in terms of
elt=
predicate.
As edge cases, when zero or one range is given, #t
is returned.
(range=? eqv? (numeric-range 0 5) (iota-range 5) (vector-range '#(0 1 2 3 4))) ⇒ #t
[SRFI-196]{data.range
}
Returns the length of range.
[SRFI-196+]{data.range
}
Returns the i-th element of range. The index
i must be an exact integer.
If i is negative, or greater than or equal to the length of range, fallback is returned if given, or an error is signaled. The fallback argument is Gauche’s extension and not in SRFI-196.
[SRFI-196+]{data.range
}
Returns the first element of range.
If the range is empty, fallback is returned if given, or an error is signaled. The fallback argument is Gauche’s extension and not in SRFI-196.
[SRFI-196+]{data.range
}
Returns the last element of range.
If the range is empty, fallback is returned if given, or an error is signaled. The fallback argument is Gauche’s extension and not in SRFI-196.
[SRFI-196]{data.range
}
Returns two ranges, the first one with elements before k-th
elements of range,
and the second one with k-th elements and after of range.
[SRFI-196]{data.range
}
Returns a new range that contains start-th (inclusive)
to end-th (exclusive) elements of range.
[SRFI-196]{data.range
}
Split range into subranges of length len. The last range
may be shorter than 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
}
Returns a new range containing initial count elements or last count
elements from range, respectively
[SRFI-196]{data.range
}
Returns a new range containing elements of range
except initial count elements or last count elements, respectively.
[SRFI-196]{data.range
}
A procedure pred must take as many arguments as the given ranges.
It is called on each corresponding element of
range, range2 …, and the procedure returns
the number of times pred returned true.
If more than one ranges are given and not all ranges are of the same length, iteration terminates at the end of the shortest range.
[SRFI-196]{data.range
}
A procedure pred must take as many arguments as the given ranges.
It is called on each first element of
range, range2 …, then each second element, and so on.
As soon as pred returns a true value, the iteration stops
and the value pred returns becomes the result of range-any
.
If pred never returns a true value, #f
is returned.
If more than one ranges are given and not all ranges are of the same length, iteration terminates at the end of the shortest range.
[SRFI-196]{data.range
}
A procedure pred must take as many arguments as the given ranges.
It is called on each first element of
range, range2 …, then each second element, and so on.
As soon as pred returns a false value, the iteration stops
and range-any
returns #f
.
If all pred returns a true value, the last value is returned.
If more than one ranges are given and not all ranges are of the same length, iteration terminates at the end of the shortest range.
[SRFI-196]{data.range
}
Mapping over ranges.
A procedure proc must take as many arguments as the given ranges,
and is called on each corresponding element of
range, range2 …. The results are collected and returned
as a range (range-map
), a list (range-map->list
,
or a vector (range-map->vector
. The dynamic order of
in which proc is invoked is not specified. Note that
range-map
computes all elements before returning the result range.
If more than one ranges are given and not all ranges are of the same length, iteration terminates at the end of the shortest range.
[SRFI-196]{data.range
}
A procedure proc must take as many arguments as the given ranges.
It is invoked with the first elements of each range,
and then with the second elements of them, and so on,
until the shortest range is exhausted. The result of proc is
discarded.
Returns an undefined value.
[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.