BindSym

上面的 debug 宏依赖于 writewriteLinestdout 在系统模块中声明的事实,因此在实例化的上下文中可见。 有一种方法可以使用绑定标识符(又名 符号)而不是使用未绑定的标识符。 内置的 bindSym 可以用于:

  1. import macros
  2.  
  3. macro debug(n: varargs[typed]): untyped =
  4. result = newNimNode(nnkStmtList, n)
  5. for x in n:
  6. # 我们可以在作用域中通过'bindSym'绑定符号:
  7. add(result, newCall(bindSym"write", bindSym"stdout", toStrLit(x)))
  8. add(result, newCall(bindSym"write", bindSym"stdout", newStrLitNode(": ")))
  9. add(result, newCall(bindSym"writeLine", bindSym"stdout", x))
  10.  
  11. var
  12. a: array[0..10, int]
  13. x = "some string"
  14. a[0] = 42
  15. a[1] = 45
  16.  
  17. 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)

但是,符号 writewriteLinestdout 已经绑定,不再被查找。如示例所示, bindSym 可以隐式地处理重载符号。