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

标签 macros type-inference haxe

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

  1. 明确输入返回值:ExprOf<Array<Whatever>>
  2. 在输出中插入类型提示

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 [];
  }
}

最佳答案

呃哦,看起来这是在与调用相同的模块(文件)中定义宏类的副作用。将类分成单独的文件即可使其工作!

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

测试.hx:

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

宏.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 被编译到宏上下文中: http://try-haxe.mrcdk.com/#1f3b2

关于macros - 如何强制 Haxe 宏返回类型为 Array/Iterable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49241957/

相关文章:

c# - Regex.Match 不适用于查找其他文本 C# 中包含的字符串

scala - 为什么用模式匹配收集不能缩小特定类别?

java - 为什么JDK Map.get不支持返回值的类型推断

f# - 什么是首选方式,明确还是允许编译器推断?

haxe - 用逆变参数覆盖父方法

generics - 在 Haxe 3 中正确调用泛型函数

ios - Haxe 究竟为 iphone/ipad 导出了什么?

c - 如何在函数体中使用外部宏?

c++ - 可移植的UNUSED参数宏,用于C和C++的函数签名

c++ - 宏内的宏扩展