.NET2.0の知られざるカリー化機能

使いどころがわからないって書いたのにまたカリー化。昨日はC#3.0に最近追加されたカリー化を扱ったけど、実は.NET2.0にもカリー化機能があります。最初に言っておくとスマートじゃないけどね。

DynamicMethodを使ってデリゲート化する際にオブジェクトをバインドするって方法です。

それ.NET2.0でもできるよってことで、昨日のサンプルと同じことをするコードです。デリゲートの名前をより適切なものにしました。.NETで名前の省略はよくないんだけど、そこは許して。

using System;
using System.Reflection.Emit;

class Curry
{
  delegate int AddOp( int n );

  static void Main()
  {
    // public static int Add( object x, int y ) { return ( int ) x + y; } を作る
    DynamicMethod dm = new DynamicMethod( "Add", typeof( int ),
      new Type[] { typeof( object ), typeof( int ) }, typeof( Curry ) );
    ILGenerator ilgen = dm.GetILGenerator();

    ilgen.Emit( OpCodes.Ldarg_0 );
    ilgen.Emit( OpCodes.Unbox_Any, typeof( int ) );
    ilgen.Emit( OpCodes.Ldarg_1 );
    ilgen.Emit( OpCodes.Add );
    ilgen.Emit( OpCodes.Ret );

    // 「( object ) 1 」を部分適用した inc デリゲートを作る
    AddOp inc = ( AddOp ) dm.CreateDelegate( typeof( AddOp ), ( object ) 1 );

    Console.WriteLine( inc( 42 ) );
    Console.WriteLine( inc( 2007 ) );

    Console.ReadKey();
  }
}

3.0と一緒でバインドするオブジェクトは参照型のみっぽい。
でもこの2.0のはカリー化とは言えないかもねぇ。部分適用してるって点は確かにそうなんだけど。
それにしてもカリー化って、だからどうした感が拭えないなぁ(^^; カリー化なんかよりパターンマッチが欲しい今日この頃。