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の参照をプロジェクトに追加します
- IronPython
- IronPython.Modules
- Microsoft.Dynamic
- Microsoft.Scripting
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 ) ); } } }
1024hello, world
init !
call !
20256
続行するには何かキーを押してください . . .
やっぱり実行速度は遅いですが、大変面白いですね。
IronPythonもっと注目されてもいいんじゃないかなぁ。