Debug示例
以下示例实现了一个强大的 debug 命令,该命令接受可变数量的参数:
- # 使用Nim语法树,我们需要一个在``macros``模块中定义的API:
- import macros
- macro debug(args: varargs[untyped]): untyped =
- # `args` 是 `NimNode` 值的集合,每个值都包含宏的参数的AST。
- # 宏总是必须返回一个 `NimNode` 。
- # 类型为 `nnkStmtList` 的节点适用于此用例。
- result = nnkStmtList.newTree()
- # 迭代传递给此宏的任何参数:
- for n in args:
- # 添加对写入表达式的语句列表的调用;
- # `toStrLit` 将AST转换为其字符串表示形式:
- result.add newCall("write", newIdentNode("stdout"), newLit(n.repr))
- # 添加对写入“:”的语句列表的调用
- result.add newCall("write", newIdentNode("stdout"), newLit(": "))
- # 添加对写入表达式值的语句列表的调用:
- result.add newCall("writeLine", newIdentNode("stdout"), n)
- var
- a: array[0..10, int]
- x = "some string"
- a[0] = 42
- a[1] = 45
- debug(a[0], a[1], x)
宏调用扩展成:
- write(stdout, "a[0]")
- write(stdout, ": ")
- writeLine(stdout, a[0])
- write(stdout, "a[1]")
- write(stdout, ": ")
- writeLine(stdout, a[1])
- write(stdout, "x")
- write(stdout, ": ")
- writeLine(stdout, x)
传递给 varargs 参数的参数包含在数组构造函数表达式中。 这就是为什么 debug 遍历所有 n 的子节点。