Iterator
Don Box's Spoutletより
http://pluralsight.com/blogs/dbox/archive/2005/04/17/7467.aspx
あ〜、なるほど、匿名メソッドを使ってIteratorモドキが出来ますね。気づかなかった・・・(^^;
using System; module M { fib () : void -> long { mutable a = 0L; mutable b = 1L; fun () { def result = b; b = b + a; a = result; result; }; } Main () : void { def f = fib (); mutable loop = true; while (loop) { def n = f (); if (n > 1000) loop = false; else Console.Write ($"$n "); } Console.WriteLine (); } } /* 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 */
Nemerleで書くとこんな感じ。いちいちdelegateを宣言しなくても、
void -> long
と書くだけで、voidからlongへの変換(関数)を意味します。つまり、fib関数の戻り値はlongを返す引数無しの関数となっています。