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

如何在运行时打印Nim的抽象语法树(AST)?

实现运行时输出AST的dumpTreeRuntime宏

dumpTree及同类宏会在编译时打印Nim的AST结构。现在需要实现一个dumpTreeRuntime宏,使其能在运行时输出完全相同的AST内容,用于捕获输出并记录到nimib文档中。

示例对比

编译时使用dumpTree的代码:

import macros

dumpTree:
  25 ⬇️
  10 ➖

它会在编译阶段输出:

StmtList
  Command
    IntLit 25
    Ident "⬇️"
  Command
    IntLit 10
    Ident "➖"

我们需要dumpTreeRuntime在运行时输出上述完全一致的内容,等价于执行:

echo """
StmtList
  Command
    IntLit 25
    Ident "⬇️"
  Command
    IntLit 10
    Ident "➖"
"""

解决方案代码

利用Nim的宏特性,在编译阶段将目标代码块的AST转换为格式化字符串,再生成运行时打印该字符串的代码:

import macros

macro dumpTreeRuntime(n: untyped): untyped =
  # 编译时生成与dumpTree格式一致的AST字符串
  let astOutput = renderTree(n, {renderNoComments, renderNoPositions})
  # 生成运行时echo该字符串的代码
  result = quote do:
    echo `astOutput`

使用测试

调用dumpTreeRuntime:

dumpTreeRuntime:
  25 ⬇️
  10 ➖

运行这段代码,就会在运行时输出与dumpTree编译时完全相同的AST结构内容。

原理说明

这个宏的核心逻辑是:

  1. 在编译阶段接收传入的代码块,通过renderTree函数将其AST转换为带缩进的格式化字符串(与dumpTree输出格式一致)。
  2. 生成运行时执行echo该静态字符串的代码,从而实现运行时输出目标AST结构的效果。

内容的提问来源于stack exchange,提问作者pietroppeter

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 21:05:15