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では、遅延シーケンスは通常のリストと統合されていて、遅延ストリームより軽いです。