debug 示例
下面的例子实现了一个接受可变参数的 debug 命令,功能强大:
# 导入 `macros` 模块以获得操作 Nim 语法树所需要的 API
import std/macros
macro debug(args: varargs[untyped]): untyped =
# `args` 是一个 `NimNode` 值列表,每个值对应一个传入参数的 AST
# 宏总是需要返回一个 `NimNode`,本例子返回的是 `nnkStmtList` 节点
result = nnkStmtList.newTree()
# 遍历传入这个宏传递的所有参数:
for n in args:
# 为语句列表添加 write 调用;
# `toStrLit` 将 AST 转换为字符串形式:
result.add newCall("write", newIdentNode("stdout"), newLit(n.repr))
# 为语句列表添加 write 调用,输出 ": "
result.add newCall("write", newIdentNode("stdout"), newLit(": "))
# 为语句列表添加 writeLine 调用,输出值并换行:
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 能遍历所有 args 子节点的原因。
当前内容版权归 vectorworkshopbaoerjie 或其关联方所有,如需对内容或内容相关联开源项目进行关注与资助,请访问 vectorworkshopbaoerjie .