haxe:基于变量值的宏具​​体化中的不同代码

haxe: different code inside macro reification based on variable value

这工作正常:

//somewhere in Foo:
static function bar(arg:StringMap<Dynamic>) {trace(arg.toString())}
...
//somewhere in build macro:
var myArr = [macro "k1"=>100, macro "k2"=>200, macro "k3"=>300];
var newExpr = macro {
    Foo.bar($a{myArr});
}

但实际上有时 myArr.length == 0 这会导致编译错误:

Array<Unknown<0>> should be haxe.ds.StringMap<Dynamic>

所以如果 myArr 的长度为零,我应该用 null 或 new StringMap() 替换 $a{myArr},但是我该怎么做呢?

目前我是这样做的:

var newExpr = myArr.length == 0 ? 
    macro {
        Foo.bar(null);
    } : macro {        
        Foo.bar($a{myArr});
    };

但实际上宏中的代码更大...

解决方法很简单:

var myArr = [macro "k1"=>100, macro "k2"=>200, macro "k3"=>300];
...
var arrExpr = myArr.length == 0 ? macro new Map<String, Dynamic>() : macro $a {myArr};
var newExpr = macro {
    Foo.bar($arrExpr);
}

您可以 运行 在宏具体化中使用 ${}

条件
var newExpr = macro Foo.bar(${myArr.length == 0 ? macro null : macro $a{myArr}});