• Debug示例

    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 的子节点。