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サポートが使いやすくなっています。