如何调试在Nim中打印变量(名称)及其值?

blu*_*e10 2 nim-lang

在快速和脏调试期间,我经常使用如下表达式:

echo "variable1: ", variable1, " variable2: ", variable2
Run Code Online (Sandbox Code Playgroud)

如何利用Nim的宏系统来避免重复变量名?

blu*_*e10 5

您可以使用遍历参数的varargs宏,并生成一个AST,它会打印节点的字符串文字及其值.像这样的东西:

import macros

macro debug*(n: varargs[typed]): untyped =
  result = newNimNode(nnkStmtList, n)
  for i in 0..n.len-1:
    if n[i].kind == nnkStrLit:
      # pure string literals are written directly
      result.add(newCall("write", newIdentNode("stdout"), n[i]))
    else:
      # other expressions are written in <expression>: <value> syntax
      result.add(newCall("write", newIdentNode("stdout"), toStrLit(n[i])))
      result.add(newCall("write", newIdentNode("stdout"), newStrLitNode(": ")))
      result.add(newCall("write", newIdentNode("stdout"), n[i]))
    if i != n.len-1:
      # separate by ", "
      result.add(newCall("write", newIdentNode("stdout"), newStrLitNode(", ")))
    else:
      # add newline
      result.add(newCall("writeLine", newIdentNode("stdout"), newStrLitNode("")))
Run Code Online (Sandbox Code Playgroud)

用法示例:

let x = 2
let y = 3
debug("hello", x, y, x*y)
Run Code Online (Sandbox Code Playgroud)

输出:

hello, x: 1, y: 2, x * y: 6
Run Code Online (Sandbox Code Playgroud)