如何强制Haxe宏返回类型为Array / Iterable?

时间:2018-03-12 18:16:39

标签: macros type-inference haxe

我想编写一个返回(表达式)数组的宏 - 但我似乎无法说服编译器将返回的值作为数组输入。我总是得到#34;即使我已经尝试过,你也无法重复动态值"

  1. 明确键入以下内容:ExprOf<Array<Whatever>>
  2. 在输出中插入类型提示
  3. http://try-haxe.mrcdk.com/#D7D82

    import haxe.macro.Context;
    import haxe.macro.Expr;
    
    class Test {
      static function main() {
        trace("Haxe is great!");
        // ERROR: You can't iterate on a Dynamic value
        for (val in Macro.someArrayExpr()) {
          trace(val);
        }
      }
    }
    
    class Macro
    {
      public static macro function someArrayExpr():ExprOf<Array<String>>
      {
        // Neither of these works:
    
        // Try to insert a type hint:
        // return Context.parse('([]:Array<String>)', Context.currentPos());
    
        return macro [];
      }
    }
    

1 个答案:

答案 0 :(得分:4)

哦,看起来这是在我的调用中在同一个模块(文件)中定义我的Macro类的副作用。将类分成单独的文件使它工作!

http://try-haxe.mrcdk.com/#57801

<强> Test.hx:

class Test {
  static function main() {
    trace("Haxe is great!");
    // Hooray, it works!
    for (val in Macro.someArrayExpr()) {
      trace(val);
    }
  }
}

<强> Macro.hx:

import haxe.macro.Context;
import haxe.macro.Expr;

//use this for macros or other classes
class Macro
{
  public static macro function someArrayExpr():ExprOf<Array<String>>
  {
    return macro ["a", "b", "c"];
  }
}

对此的技术解释(thanks to Juraj):在宏上下文中键入Test类。在这种情况下,它从一个宏调用宏,它总是键入动态,因此错误。因此,另一种解决方案是将类Test排除在编译为宏上下文之外:http://try-haxe.mrcdk.com/#1f3b2