クラス生成マクロ

マクロの練習。

using Nemerle.Compiler;
using Nemerle.Collections;

macro MakeClass (class_name : string) {
    // 現在のコンテキストを取得
    def ctx = Nemerle.Macros.ImplicitCTX ();
    // 文字列を識別子に変換
    def nm = Macros.UseSiteSymbol (class_name);
    // グローバルコンテキストに型を追加
    def builder = ctx.Env.Define (<[ decl: 
        public class $(nm : name) {
            public static Method () : void {
                System.Console.WriteLine ("Hello, World");
            }
        }
    ]>);
    // 型を生成
    builder.Compile ();
    <[ () ]>
}

使ってみる。

// クラス"Foo"を作成
MakeClass ("Foo");
// クラスメソッド呼び出し
Foo.Method ();

/* 結果
Hello, World
 */

ソースコード上、どこにも存在しないクラス"Foo"を使っていることに注目。