読者です 読者をやめる 読者になる 読者になる

DLR AST (0)

.NET

荒井さんの 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 メソッドが代わりにやってくれています.

更新履歴