You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何查看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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 04:35:12