Gauche:Generator

Gauche:Generator


関連ファイル

GaucheRefj:gauche.generator GaucheRefe:gauche.generator

ジェネレータは、値の列の生成器となるような、引数を取らない手続きです。 呼ばれる度に列の次の値を返します。列の終端に達した場合はEOFが返されます。 例えば、read-charは、現在の入力ポートからの入力を一文字づつ返す ジェネレータと考えることができます。

値の列の生成源を手続きによってジェネレータとして抽象化するのは広く使われるテクニックなので、 このようなジェネレータに共通して使えるユーティリティがあると便利です。 このモジュールはそのために作られました。

ジェネレータは、必要になったら計算を行うようなシステムを簡単に実現でき、 効率も極めて良いですが、副作用に頼った抽象化であることには注意が必要です。 例えば、途中まで列を生成した後に、最初にもどってやり直す、といったことはできません。 より関数的にオンデマンドの計算を行うためには、ジェネレータを使って 構築された、遅延シーケンスを使うのが便利です (GaucheRefj:遅延シーケンス参照)。

このモジュールを使うと、様々なジェネレータを作って組み合わせることができます。 いずれ、コードのどこかでそういったジェネレータの生成する値を消費することが必要なわけですが、そのために使えるいくつかの組み込み手続きがあります。 GaucheRefj:生成された値の畳み込みを参照してください。

A generator is merely a procedure with no arguments and works as a source of a series of values. Every time it is called, it yeilds a value. The EOF value indicates the generator is exhausted. For example, read-char can be seen as a generator that generates characters from the current input port.

It is common practice to abstract the source of values in such a way, so it is useful to define utility procedures that work on the generators. This module provides them.

A generator is very lightweight, and handy to implement simple on-demand calculations. However, keep in mind that it is side-effecting construct; you can’t safely backtrack, for example. For more functional on-demand calculation, you can use lazy sequences (See section GaucheRefe:Lazy sequences), which is actually built on top of generators.

You can construct and combine various generators with this module. Eventually, your code need to consume the generated value. There are several built-in procedures for that; see GaucheRefe:Folding generated values.

Gauche:generator

Shiro(2012/02/20 02:48:07 UTC): 0.9.3に入るジェネレータに関するもろもろのメモ。

John Nash's Cipherer

Gauche:streamとgenerator

Gauche:イテレータの反転の汎用化




Tags: generator, ジェネレータ, gauche.generator


Last modified : 2013/05/07 10:43:02 UTC