
181
6.2 再帰多すぎ!(トランポリンとジェネレータ)
実際には、このような方法で組み立てられた構造は(完全とはいえないものの)
ジェネレータと呼ばれる形態です。言い換えると、任意の時点での要求に対して「続
きの値」を返す関数です。これらをすべて念頭に置いて、
generator
関数を以下のよ
うに実装します。
function generator(seed, current, step) {
return {
head: current(seed),
tail: function() {
console.log("forced"); //
デモ用の出力で、ロジックには関係ありません
return generator(step(seed), current, step);
}
};
}
current
パラメータには頭の値を計算する関数が渡され、
step
には再帰呼び出しに
渡す値を計算する関数が渡されます。
tail
の値のキーポイントは、値が関数であり、
呼び出されるまでは「実際の値」ではないということです。そして、このジェネレー
タを操縦するために以下のユーティリティ関数を定義します。
function genHead(gen) { return gen.head; }
function genTail(gen) { return gen.tail(); }
genHead
と
genTail
関数はその名前が意味する通り、それぞれ「頭」と「尾」を返
します。
genTail
の戻り値は「強制的に生成された」尾の値です ...