久々に
Nemerleのsvnを覗いてみたら今月、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)); } }