DLR beta2 を使ったホスティング

ついにIronPython 2.0 Beta2が公開されました。以前のエントリでも言及しましたが、DLRを構成するアセンブリが、「Microsoft.Scripting.dll」と「Mictosoft.Scripting.Core.dll」に分離されました。リリースノートに記述されていますが、DLRを使った動的言語向けの機能をまとめたのがCoreであり、Scripting.dllは再利用可能なヘルパー実装であるとの説明があります。この公開されたばかりのBeta2のDLRを使って、何度か試してきた「簡単な言語」を動くようにしたいと思います。

最初にコンソールを実装するするためのConsoleHostクラスですが、ネームスペースがHostingからHosting.Shellに変更になっており、Initializeメソッドが廃止になっています。このため新しく記述しなおしたのが、以下のコードとなります。

 protected override CommandLine CreateCommandLine()
{
    return new Hosting.MyCalcCommandLine();
}

protected override Microsoft.Scripting.Hosting.ScriptEngine
                              CreateEngine()
{
    return Runtime.GetEngine(
             typeof(Runtime.MyCalcLanguageContext));
}

CreateEngineメソッド」がBeta1までのInitializeメソッドに相当します。そして「CreateCommandLineメソッド」が新しい追加されたもので、コンソールの独自のプロンプトなどを実装するCommandLine実装のインスタンスを戻します。この機能によってLanguageContextクラスのGetServiceメソッドで行っていたCommandLineなどが不要になります。

次に上記で説明したCreateCommandLineメソッドによりLanguageContextクラスから「GetService」メソッドを削除します。またGetServoceメソッドの削除により、OptionParserクラスの実装も削除します。そしてLanguageContextで変更しないといけないのが、「ParseSourceCode」メソッドになります。このメソッドの内容を以下に示します。

 public override Microsoft.Scripting.Ast.LambdaExpression
                 ParseSourceCode(CompilerContext context)
{
    string code = context.SourceUnit.GetCode();
    context.SourceUnit.CodeProperties = SourceCodeProperties.None;
    // Ast.LambdaがExpression.Lambdaに変更 for Beta2
    LambdaBuilder codeblock = Expression.Lambda("", typeof(object));
    //LambdaBuilder codeblock = Ast.Lambda( "", typeof(object));
    //CodeBlock codeblock = Ast.CodeBlock(code);
    codeblock.Body = Parser.MyCalcParser.ParseCode(code);
    return codeblock.MakeLambda();
}

コメントでも記述していますが、Microsoft.Scripting.Ast.Astクラスが廃止され、同等の機能がMicrosoft.Scripting.Ast.Expressionクラスにまとめられました。この変更を受けて、MyCalcParserとPrintといったAstを使っていたクラスを同じように変更する必要があります。ここまでの変更が完了すれば、DLR Beta2を使って問題くなく動作するようになります。

またChangeSet32648を使ってご紹介したIronPythonのclr.AddReferenceToTypeLibraryメソッドは、IronPython 2.0 Beta2 で実装されています。このためIronPythonでのOLE Automationサポートが使いやすくなっています。

MyCalcB2.zip