我想编写一个宏,它必须根据命名元组或对象的字段执行某些逻辑。我认为最好通过将元组/对象作为typed
参数传递给宏来实现。
问题是,如何迭代typed
参数的字段?我基本上寻找宏的fieldPairs
等价物,即,不必采用具体的元组/对象,它必须在NimNode
上运行,并且还返回字段名称/类型(用于进一步生成AST)。
答案 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
中找到。我们只需要确保正确处理元组和对象:对于元组,ntyObject
是IdentDefs
的直接子元素,而对于对象,IdentDefs
存储在子元素中索引2(索引0上的子项包含编译指示信息,索引1上的子项是父项的信息)。
整体上看起来像一个宏(为了说明添加了一些调试输出):
NimNode