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を返す引数無しの関数となっています。