C#とIronPythonの連係がすごいことに

つい先日(Apr.12 2010)IronPythonの新しいバージョンがリリースされました。
言語仕様自体は変わっていませんが(2.6.1)、.NET 4.0向け機能が完成したようです。
β版の頃から注目していましたが、C#4.0(dynamic)と非常に相性がいい!
早速プログラムを見ていただきましょう。

Script.py

def hello( x ) :
	print "hello, " + x

class Foo() :
	def __init__( self ) :
		print "init !"

	def __call__( self ) :
		print "call !"

	def method( self ) :
		return self.x * self.y

def getMetaClass() :
	return type( 'Bar', (), {'expt' : lambda self, x : 2 ** x} )

C#

以下のDLLの参照をプロジェクトに追加します

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using IronPython.Hosting;
using Microsoft.Scripting.Hosting;

namespace DynamicIPy
{
	class Program
	{
		static void Main(string[] args)
		{
			var python = Python.CreateEngine();

			// その場で式を実行。あまり面白くない例。
			int result1024 = python.Execute<int>( "2 ** 10" );
			Console.WriteLine( result1024 );
			Console.WriteLine();

			// ファイルを実行。helloメソッドを呼ぶ。まだ面白くない。
			dynamic global = python.ExecuteFile( "Script.py" );
			global.hello( "world" );
			Console.WriteLine();
			

			// Python側のクラスのインスタンスを作ってみる。
			dynamic foo = global.Foo();
			foo();     // __call__
			foo.x = 2; // dynamicだからこんなことができる!
			foo.y = 10;
			int result20 = foo.method();
			Console.WriteLine( result20 );
			Console.WriteLine();

			// Python側のメタクラスをこっちで使ってみる
			dynamic Bar = global.getMetaClass();
			dynamic bar = Bar(); // Barクラスのインスタンスを作る!
			Console.WriteLine( bar.expt( 8 ) );
		}
	}
}

1024

hello, world

init !
call !
20

256
続行するには何かキーを押してください . . .


やっぱり実行速度は遅いですが、大変面白いですね。
IronPythonもっと注目されてもいいんじゃないかなぁ。


PythonC#も久しぶりに触りました・・・。りはびり。