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

Macros 如何强制Haxe宏返回类型为Array/Iterable?,macros,type-inference,haxe,Macros,Type Inference,Haxe,我想编写一个宏来返回一个数组(表达式)——但我似乎无法说服编译器我的返回值将被类型化为数组。我总是得到“你不能在动态值上迭代”,即使我尝试过: 将返回显式键入为:ExprOf 导入haxe.macro.Context; 导入haxe.macro.Expr; 课堂测试{ 静态函数main(){ trace(“Haxe太棒了!”); //错误:不能对动态值进行迭代 for(宏.someArrayExpr()中的val){ 微量元素(val); } } } 类宏 { 公共静态宏函数somerrayex

我想编写一个宏来返回一个数组(表达式)——但我似乎无法说服编译器我的返回值将被类型化为数组。我总是得到“你不能在动态值上迭代”,即使我尝试过:

  • 将返回显式键入为:
    ExprOf

    导入haxe.macro.Context;
    导入haxe.macro.Expr;
    课堂测试{
    静态函数main(){
    trace(“Haxe太棒了!”);
    //错误:不能对动态值进行迭代
    for(宏.someArrayExpr()中的val){
    微量元素(val);
    }
    }
    }
    类宏
    {
    公共静态宏函数somerrayexpr():ExprOf
    {
    //这两项工作都不是:
    //尝试插入类型提示:
    //返回Context.parse(“([]:数组)”,Context.currentPos();
    返回宏[];
    }
    }
    
    哦,看起来这是在调用的同一模块(文件)中定义宏类的副作用。将类分离为单独的文件使其工作

    测试。hx:

    class Test {
      static function main() {
        trace("Haxe is great!");
        // Hooray, it works!
        for (val in Macro.someArrayExpr()) {
          trace(val);
        }
      }
    }
    
    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"];
      }
    }
    
    Macro.hx:

    class Test {
      static function main() {
        trace("Haxe is great!");
        // Hooray, it works!
        for (val in Macro.someArrayExpr()) {
          trace(val);
        }
      }
    }
    
    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"];
      }
    }
    
    导入haxe.macro.Context;
    导入haxe.macro.Expr;
    //用于宏或其他类
    类宏
    {
    公共静态宏函数someArrayExpr():ExprOf):测试类是在宏上下文中键入的。在这种情况下,它从宏调用宏,而宏始终是动态键入的,因此会出现错误。因此,另一种解决方案是将类测试从编译到宏上下文中排除: