久々に

Nemerlesvnを覗いてみたら今月、0.9.4が出るような記述がありました。1年半ぶりでしょうか。(^^;
ほとんどが内部的なリファクタリングですが、新機能としてはC#3.0のAuto Propertyが実装されているみたいです。個人的にはmutableキーワードをvarにして、早く1.0をリリースして欲しいんだけどなぁ。

C#3.0で型推論が追加されましたが、varは代入時にしか使えないし、ラムダ式をvar変数に代入しようとするとエラーになるので、

using System;
using System.Linq;
using System.Linq.Expressions;

namespace ConsoleApplication1
{
    class Program
    {
        static int Fibonacci(int n)
        {
            Func<int, int, int, int> fib = null;
            fib = (x, y, z) =>
            {
                if (x == 0) return y;
                return fib(x - 1, y + z, y);
            };
            return fib(n - 1, 1, 0);
        }
        static void Main()
        {
            Console.WriteLine(Fibonacci(10));
        }
    }
}

こんな記述をしなければなりません。ところで上記で使っているようなdelegate変数を宣言しておくことで再帰呼び出し可能にするテクニック(?)が逃げ道っぽくて気になります。

            var fib = (x, y, z) =>
            {
                if (x == 0) return y;
                return fib(x - 1, y + z, y);
            };
            return fib(n - 1, 1, 0);

こう書けて欲しいのですが・・・

Nemerleだと型推論が強力なのでもーちょっと頑張るし、そもそもローカル関数をサポートするので再帰呼び出しのための小細工は不要だったりします。

using System;

module Program 
{
    Fibonacci (n : int) : int
    {
#if true
        mutable fib;
        fib = (x, y, z) =>
        {
            | (0, _, _) => y
            | _ => fib(x - 1, y + z, y)
        }
#else
        // Nemerleは普通にローカル関数を書けるがC#との対比のため
        def fib (x, y, z)
        {
            | (0, _, _) => y
            | _ => fib(x - 1, y + z, y)
        }
#endif
        fib (n - 1, 1, 0)
    }

    Main() : void
    {
        Console.WriteLine (Fibonacci(10));
    }
}