我想编写一个返回(表达式)数组的宏 - 但我似乎无法说服编译器将返回的值作为数组输入。我总是得到#34;即使我已经尝试过,你也无法重复动态值"
ExprOf<Array<Whatever>>
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 [];
}
}
答案 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