我正在尝试使用宏来从中转换一些变量声明:
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");
}
我更倾向于第三个选项(较短的语法,相同的结果)。
但是我不知道如何编写宏(是否应该将String作为参数?表达式?)以及如何正确地将其作为宏表达式返回。
这是到目前为止我得到的(中断)代码:
macro static function getCompById(someVar:Expr, typeVar:Expr) {
return macro {
var someVar:typeVar = cast container.getCompById("someVar");
};
}
有任何想法吗?
您发布的代码的问题首先是,您需要使用转义转义机制才能使其正常工作-因此,第一个更改是使用宏转义:
return macro var $someVar:$typeVar = cast container.getCompById($v{someVar});
现在会有一些问题:期望someVar
是String类型,并且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;
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句