Debug示例

以下示例实现了一个强大的 debug 命令,该命令接受可变数量的参数:

  1. # 使用Nim语法树,我们需要一个在``macros``模块中定义的API:
  2. import macros
  3.  
  4. macro debug(args: varargs[untyped]): untyped =
  5. # `args` 是 `NimNode` 值的集合,每个值都包含宏的参数的AST。
  6. # 宏总是必须返回一个 `NimNode` 。
  7. # 类型为 `nnkStmtList` 的节点适用于此用例。
  8. result = nnkStmtList.newTree()
  9. # 迭代传递给此宏的任何参数:
  10. for n in args:
  11. # 添加对写入表达式的语句列表的调用;
  12. # `toStrLit` 将AST转换为其字符串表示形式:
  13. result.add newCall("write", newIdentNode("stdout"), newLit(n.repr))
  14. # 添加对写入“:”的语句列表的调用
  15. result.add newCall("write", newIdentNode("stdout"), newLit(": "))
  16. # 添加对写入表达式值的语句列表的调用:
  17. result.add newCall("writeLine", newIdentNode("stdout"), n)
  18.  
  19. var
  20. a: array[0..10, int]
  21. x = "some string"
  22. a[0] = 42
  23. a[1] = 45
  24.  
  25. debug(a[0], a[1], x)

宏调用扩展成:

  1. write(stdout, "a[0]")
  2. write(stdout, ": ")
  3. writeLine(stdout, a[0])
  4.  
  5. write(stdout, "a[1]")
  6. write(stdout, ": ")
  7. writeLine(stdout, a[1])
  8.  
  9. write(stdout, "x")
  10. write(stdout, ": ")
  11. writeLine(stdout, x)

传递给 varargs 参数的参数包含在数组构造函数表达式中。 这就是为什么 debug 遍历所有 n 的子节点。