如何查看Nim元编程中NimNode的内容?
解决Nim宏中无法查看NimNode内容的问题
先纠正宏调用的语法错误
你当前的代码里,generateMapper(): 的括号已经闭合,后面缩进的proc定义并没有被传入宏的body参数,导致body是空节点,所以echo body.repr没有输出。
正确的宏调用应该使用do块语法(去掉括号),这样后续的代码才会被捕获为untyped参数:
macro generateMapper(body: untyped): untyped = echo body.repr generateMapper: proc useThisToGenerateAProc(source: A, target: B)
查看NimNode内容的几种方法
1. 使用repr方法
确认参数正确传入后,body.repr会返回节点的字符串表示,包含节点类型、子节点等核心信息,通过echo即可打印:
macro generateMapper(body: untyped): untyped = echo "Node repr output:" echo body.repr generateMapper: proc useThisToGenerateAProc(source: A, target: B)
2. 使用标准库的dumpTree宏
导入macros模块后,dumpTree()可以更结构化地打印节点的层级关系,比repr更易读:
import macros macro generateMapper(body: untyped): untyped = echo "dumpTree output:" dumpTree(body) generateMapper: proc useThisToGenerateAProc(source: A, target: B)
3. 手动遍历节点(自定义打印)
如果需要更细粒度的控制,可以编写一个辅助递归过程,遍历并打印每个节点的类型和内容:
import macros proc dumpNode(n: NimNode, indent = 0) = let indentStr = " ".repeat(indent) echo indentStr & n.kind.repr & ": " & n.toStr for child in n.children: dumpNode(child, indent + 1) macro generateMapper(body: untyped): untyped = echo "Custom node dump:" dumpNode(body) generateMapper: proc useThisToGenerateAProc(source: A, target: B)
内容的提问来源于stack exchange,提问作者Philipp Doerner
相关产品推荐
相关产品推荐

