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

11.56 srfi.221 - ジェネレータ/アキュムレータ サブライブラリ

Module: srfi.221

このsrfiは、ジェネレータライブラリにいくつか有用な手続きを追加するものです。 (Gaucheのネイティブなジェネレータについてはgauche.generator - ジェネレータを、 R7RS-largeのジェネレータについてはscheme.generator - R7RSジェネレータを参照。)

Function: gcompose-left constructor operation …
Function: gcompose-right constructor operation …

[SRFI-221]{srfi.221} constructorは引数を取らずジェネレータを返す手続き、 各operationはジェネレータを取りジェネレータを返す手続きです。

これらの手続きは、constructorで作られるジェネレータにoperationsを 合成したジェネレータを作って返します。 gcompose-leftoperatorを左から右に(左結合)、 gcompose-rightは右から左に(右結合)適用します。

(use gauche.generator)
(use srfi.221)

(generator->list
  (gcompose-left
    (cut make-iota-generator 100)
    (cut gfilter even? <>)
    (cut ggroup <> 5)))
 ⇒ ((0 2 4 6 8) (10 12 14 16 18) (20 22 24 26 28)
     (30 32 34 36 38) (40 42 44 46 48) (50 52 54 56 58)
     (60 62 64 66 68) (70 72 74 76 78) (80 82 84 86 88)
     (90 92 94 96 98))

;; The same result can be obtained with:
(generator->list
  (gcompose-right
    (cut ggroup <> 5)
    (cut gfilter even? <>)
    (cut make-iota-generator 100)))
Function: accumulate-generated-values accumulator generator

[SRFI-221]{srfi.221} generatorを繰り返し呼び、得られる値をaccumulatorに蓄積してゆきます。 generatorが尽きたら、蓄積された値を返します。 アキュムレータについてはscheme.generator - R7RSジェネレータを参照してください。

これは、generator->listのような変換器の一般化です。 渡すアキュムレータによって、どういうオブジェクトに変換するかが決まります。

Function: genumerate gen

[SRFI-221]{srfi.221} 0から始まる整数と、genが生成する値とのペアを次々に生成するジェネレータを返します。

(generator->list (genumerate (list->generator '(a b c d e))))
  ⇒ ((0 . a) (1 . b) (2 . c) (3 . d) (4 . e))
Function: gchoice choice-gen source-gen …

[SRFI-221]{srfi.221} 引き数は全てジェネレータです。 choice-genジェネレータの値に従ってsource-genを選び、そのジェネレータが 生成する値を返すようなジェネレータを作って返します。

choice-genは0からsource-genの数マイナス1までの正確な整数を 返すジェネレータです。

結果のジェネレータが呼ばれると、まずchoice-genが呼ばれます。 それが既に尽きていたら、結果のジェネレータも尽きます。

そうでなければ、choice-genの値番目のsource-genが選ばれて呼ばれ、 それが尽きてなければその結果が返されます。

選ばれたsource-genが既に尽きていた場合、尽きていないsource-genが選ばれるまで choice-genが繰り返し呼ばれます。全てのsource-genが尽きた場合は 結果のジェネレータも尽きます。

Function: stream->generator stream

[SRFI-221]{srfi.221} 遅延ストリームstreamの要素を次々に生成するジェネレータを返します。 遅延ストリームは、R7RS-largeのscheme.streamで定義されています (scheme.stream - R7RSストリーム参照)。それはGaucheのutil.streamのサブセットです (util.stream - ストリームライブラリ参照)。

Function: generator->stream generator

[SRFI-221]{srfi.221} generatorが生成する値を要素とする遅延ストリームを返します。 遅延ストリームは、R7RS-largeのscheme.streamで定義されています (scheme.stream - R7RSストリーム参照)。それはGaucheのutil.streamのサブセットです (util.stream - ストリームライブラリ参照)。

なお、R7RS-largenのscheme.lseqで定義される遅延シーケンスを返す genreator->lseqもあります (遅延シーケンス参照)。 Gaucheでは、遅延シーケンスは通常のリストと統合されていて、遅延ストリームより軽いです。



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