2014-11-14 5 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"); 
} 

Я склоняюсь больше к третьей опции (короткий синтаксис, одинаковые результаты).

Но я понятия не имею, как написать макрос (должен ли он принимать параметр String как выражение?) И как правильно вернуть это выражение макроса.

Это (прерывистая) код, который я получил до сих пор:

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 будет иметь тип 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; 
    } 
} 
+0

Хм возможно я использую другую версию Haxe, если У меня нет 'haxe.macro.Tools'? Кажется, что не существует в пакете (в 3.1.3) – bigp

 Смежные вопросы

  • Нет связанных вопросов^_^