記事訂正: DLR AST の直接コンパイルは依然として標準サポートでした
Microsoft.Scripting.Ast.TreeCompiler
『C#, DLR AST, meta programming』で「DLR AST の直接コンパイルは public クラスからはできない」と書きましたが,すみません,誤報でした.
荒井さんのエントリ『DLRのASTのみを使う』にあるように,TreeCompiler クラスのスタティックメソッドを使えば,オリジナルの Microsoft.Scripting.dll を参照設定に加えるだけで DLR AST を直接コンパイルできます.
using System; using System.Collections.Generic; using Microsoft.Scripting; using Microsoft.Scripting.Ast; static class Program { static void Main(string[] args) { var cw = typeof(Console).GetMethod("WriteLine", new[] { typeof(string) }); var cb = Ast.CodeBlock("MyFunc", typeof(void)); cb.Body = Ast.Block( Ast.Call(cw, Ast.Constant("Hello, World!")), Ast.Call(cw, Ast.Constant("Hello, World!")), Ast.Call(cw, Ast.Constant("Hello, World!")) ); var dynamicFunc = TreeCompiler.CompileBlock<Action>(cb); dynamicFunc(); } }
Compiler クラスは確かに internal に引っ込んでしまったのですが,新しくクラスが追加されているのに気付いてませんでした.以下の記事とサンプルコードは,IronPython 2.0 A8 の TreeCompiler 用に修正してあります.
『I love tree - 荒井省三のBlog』で紹介されている Martin 氏のエントリも非常に参考になります.
最もメタになる「初心者用 Eval」は DLR AST
というわけで,
これら全てを兼ね備えた,最もメタになる「初心者用 Eval」として,DLR AST を強く推したいところです.
しかも,DLR AST は好きな言語で書くことができます.C# で,F# で,IronRuby で,あるいは DLR AST 自身で DLR AST を出力させることだって可能です.
個人的には,Silverlight 2.0 で DLR AST が使えるかどうかが激しく気になるところです.これが許されるのであれば,実行環境が一気に広がりますものね.その先には,Ajax でやっているように,コード片をサーバからクライアントに動的にプッシュするといった展開も考えられます.そしてそれが言語非依存ってのは面白いと.