srfi.221 - ジェネレータ/アキュムレータ サブライブラリ ¶このsrfiは、ジェネレータライブラリにいくつか有用な手続きを追加するものです。
(Gaucheのネイティブなジェネレータについてはgauche.generator - ジェネレータを、
R7RS-largeのジェネレータについてはscheme.generator - R7RSジェネレータを参照。)
[SRFI-221]{srfi.221}
constructorは引数を取らずジェネレータを返す手続き、
各operationはジェネレータを取りジェネレータを返す手続きです。
これらの手続きは、constructorで作られるジェネレータにoperationsを
合成したジェネレータを作って返します。
gcompose-leftはoperatorを左から右に(左結合)、
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)))
[SRFI-221]{srfi.221}
generatorを繰り返し呼び、得られる値をaccumulatorに蓄積してゆきます。
generatorが尽きたら、蓄積された値を返します。
アキュムレータについてはscheme.generator - R7RSジェネレータを参照してください。
これは、generator->listのような変換器の一般化です。
渡すアキュムレータによって、どういうオブジェクトに変換するかが決まります。
[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))
[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が尽きた場合は 結果のジェネレータも尽きます。
[SRFI-221]{srfi.221}
遅延ストリームstreamの要素を次々に生成するジェネレータを返します。
遅延ストリームは、R7RS-largeのscheme.streamで定義されています
(scheme.stream - R7RSストリーム参照)。それはGaucheのutil.streamのサブセットです
(util.stream - ストリームライブラリ参照)。
[SRFI-221]{srfi.221}
generatorが生成する値を要素とする遅延ストリームを返します。
遅延ストリームは、R7RS-largeのscheme.streamで定義されています
(scheme.stream - R7RSストリーム参照)。それはGaucheのutil.streamのサブセットです
(util.stream - ストリームライブラリ参照)。
なお、R7RS-largenのscheme.lseqで定義される遅延シーケンスを返す
genreator->lseqもあります (遅延シーケンス参照)。
Gaucheでは、遅延シーケンスは通常のリストと統合されていて、遅延ストリームより軽いです。