クラス生成マクロ
マクロの練習。
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"を使っていることに注目。