从表达式宏返回匿名结构

问题描述 投票:0回答:1

给定一个地图 Map 我如何从表达式宏创建匿名结构?

这就是我想要达到的目标:

var res = myMacroFunc(["var1"=>12, "var2"=>66]);

res == {var1: 12, var2: 66}
macros haxe
1个回答
1
投票

可能有更简洁的方法来做到这一点……但是您可以遍历数组声明中的每个表达式,使用 switch 语句来匹配

$a => $b
并生成ObjectField。将所有 ObjectFields 存储在一个数组中以创建一个 EObjectDecl。

这是 Haxe Playground 中的工作版本。

public static macro function myMacroFunc(e:haxe.macro.Expr):haxe.macro.Expr {
  final objects = [];
  switch (e.expr) {
    // input is array decl
    case EArrayDecl(values):
      {
        for (v in values) {
          switch (v) {
            // match expression of format $a => $b
            case macro $a => $b: {
                switch (a.expr) {
                  // "a" must be a string constant, so we extract that
                  case EConst(CString(s, _)): {
                      objects.push({field: s, expr: b});
                    }
                  case _: {}
                }
              }
            case _: {}
          }
        }
      }
    case _:
      {}
  }

  return {
    pos: e.pos, // re-use input position
    expr: EObjectDecl(objects) // pass to EObjectDecl
  };
}
© www.soinside.com 2019 - 2024. All rights reserved.