如何迭代宏中的元组/对象的字段(名称+类型)?

时间:2017-02-26 10:58:39

标签: nim

我想编写一个宏,它必须根据命名元组或对象的字段执行某些逻辑。我认为最好通过将元组/对象作为typed参数传递给宏来实现。

问题是,如何迭代typed参数的字段?我基本上寻找宏的fieldPairs等价物,即,不必采用具体的元组/对象,它必须在NimNode上运行,并且还返回字段名称/类型(用于进一步生成AST)。

1 个答案:

答案 0 :(得分:1)

我找到了问题的解决方案,这似乎工作正常,但我不确定是否有更好的选择。该解决方案基于getTypeImpl参数上的typed。要查看它是如何工作的,有助于查看t.getTypeImpl.treeRepr的输出以获取简单的元组和对象。

  • 元组:例如(x: 0, y: 1, name: "")的类型impl AST看起来像这样:

    TupleTy
      IdentDefs
        Sym "x"
        Sym "int"
        Empty
      IdentDefs
        Sym "y"
        Sym "int"
        Empty
      IdentDefs
        Sym "name"
        Sym "string"
        Empty
    

    注意:typeKind的{​​{1}}为getTypeImpl

  • 对象:具有相同结构的对象的类型impl AST将是:

    ntyTuple

    注意:ObjectTy Empty Empty RecList IdentDefs Sym "x" Sym "int" Empty IdentDefs Sym "y" Sym "int" Empty IdentDefs Sym "name" Sym "string" Empty 的{​​{1}}为typeKind

这表明我们正在寻找的信息可在getTypeImpl中找到。我们只需要确保正确处理元组和对象:对于元组,ntyObjectIdentDefs的直接子元素,而对于对象,IdentDefs存储在子元素中索引2(索引0上的子项包含编译指示信息,索引1上的子项是父项的信息)。

整体上看起来像一个宏(为了说明添加了一些调试输出):

NimNode