DLR AST (0)
荒井さんの blog を読んでいると,行かないつもりだった TechEd 2007 Yokohama に行きたくなってくる今日この頃.
Orcas を入れなくても .NET AST で遊べるのはおもしろいですね.テスト用の AST の作成ですが,私は F# を利用したものをちょこちょこ作っています.公開はもうちょっと先になりそうですが.
以下はそのプロトタイプとして作った C# 版のテストコードです.Microsoft.Scripting.dll を参照に加えてください.
using System; using Microsoft.Scripting; using Microsoft.Scripting.Ast; using System.Reflection.Emit; namespace ASTTest { delegate T Func<T>(); static class Program { static void Main(string[] args) { CodeBlock cb = Ast.CodeBlock("MyFunc", typeof(int)); cb.Body = Ast.Return( Ast.Condition( Ast.True(), Ast.Constant(1), Ast.Constant(2) ) ); Func<int> func = TreeCompiler.CompileBlock<Func<int>>(cb); Console.WriteLine("act() => {0}", func()); } } }
評価しているのは以下のような AST です.
- If
- True
- 1
- 2
この AST が Lightweight Code Gen (LCG) を経由して動的メソッドに展開されています.通常,LCG では IL 出力を自分で書かなくてはなりませんが,その部分は DLR の AST.Emit メソッドが代わりにやってくれています.
更新履歴
- 2008年3月2日
- IronPython 2.0 A8 用にコードを修正しました.