Как в 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");
    };
}

Любые идеи?


person bigp    schedule 14.11.2014    source источник


Ответы (1)


Проблема с кодом, который вы разместили, заключается в том, что вам понадобятся механизмы экранирования повторения, чтобы это работало правильно. - поэтому первым изменением будет использование escape-последовательности макросов:

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;
  }
}
person Waneck    schedule 15.11.2014
comment
Хм, возможно ли, что я использую другую версию Haxe, если у меня нет haxe.macro.Tools? Кажется, не существует в пакете (в версии 3.1.3) - person bigp; 17.11.2014