.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のはカリー化とは言えないかもねぇ。部分適用してるって点は確かにそうなんだけど。
それにしてもカリー化って、だからどうした感が拭えないなぁ(^^; カリー化なんかよりパターンマッチが欲しい今日この頃。