2014-11-14 53 views
2

我試圖使用宏一些變量聲明從這個轉換:在Haxe中,你如何讀取宏內的變量名?

function test():Void { 
    var someComp:Component = __SOME_MACRO__(); 

    // Or... 
    @getCompById var someComp:Component; 

    // Or even simpler... 
    getCompById(someComp, Component); //do some fancy macro magic... 
    // Also, if it's not possible/easy with a variable ... 
    getCompById("someComp", Component); //with a string of the variable name. 
} 

...這樣的:

function test() { 
    var someComp:Component = cast container.getCompById("someComp"); 
} 

我傾向於更多地接近第三個選項(短語法,相同的結果)。

但我不知道如何編寫宏(如果它需要一個字符串作爲參數?表達式?)以及如何正確地返回它作爲宏表達式。

這是(碎)的代碼,我已經得到了迄今:

macro static function getCompById(someVar:Expr, typeVar:Expr) { 
    return macro { 
     var someVar:typeVar = cast container.getCompById("someVar"); 
    }; 
} 

任何想法?

回答

5

與您發佈的代碼的問題是:第一,你需要reification escaping mechanisms爲使其正常工作 - 這樣的第一個變化是使用了宏轉義:

return macro var $someVar:$typeVar = cast container.getCompById($v{someVar}); 

現在會有一些問題與此:它期望someVar類型字符串和typeVar類型ComplexType。從Expr獲取字符串組件很容易。然而,將Expr轉換爲ComplexType並不容易。要做到這一點最簡單的方法是使用tink_macros庫,並使用asComplexType

所以(未經測試)的代碼看起來是這樣的:

using tink.MacroAPI; 
using haxe.macro.Tools; 
macro static function getCompById(someVarExpr:Expr, typeVarExpr:Expr) 
{ 
    var typeVar = typeVarExpr.toString().asComplexType(); 
    switch (someVarExpr.getIdent()) 
    { 
    case Success(someVar): 
     return macro var $someVar:$typeVar = cast container.getCompById($v{someVar}); 
    case Failure(error): throw error; 
    } 
} 
+0

嗯是有可能我用,如果不同版本HAXE的我沒有'haxe.macro.Tools'?似乎並不存在於軟件包中(即在3.1.3中) – bigp 2014-11-17 14:00:26