【问题标题】:In Haxe, how do you read a variable name inside of a Macro?在 Haxe 中,如何读取宏中的变量名?
【发布时间】:2014-11-14 21:07:29
【问题描述】:

我正在尝试使用宏来转换一些变量声明:

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");
    };
}

有什么想法吗?

【问题讨论】:

    标签: macros haxe local-variables compile-time


    【解决方案1】:

    您发布的代码的问题首先是您需要reification escaping mechanisms 才能正常工作 - 所以第一个更改是使用宏转义:

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

    现在会有一些问题:它期望someVar 是String 类型,而typeVarComplexType 类型。从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;
      }
    }
    

    【讨论】:

    • 嗯,如果我没有 haxe.macro.Tools,我是否可以使用不同版本的 Haxe?包中似乎不存在(在 3.1.3 中)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多