BindSym
上面的 debug 宏依赖于 write , writeLine 和 stdout 在系统模块中声明的事实,因此在实例化的上下文中可见。 有一种方法可以使用绑定标识符(又名 符号)而不是使用未绑定的标识符。 内置的 bindSym 可以用于:
- import macros
- macro debug(n: varargs[typed]): untyped =
- result = newNimNode(nnkStmtList, n)
- for x in n:
- # 我们可以在作用域中通过'bindSym'绑定符号:
- add(result, newCall(bindSym"write", bindSym"stdout", toStrLit(x)))
- add(result, newCall(bindSym"write", bindSym"stdout", newStrLitNode(": ")))
- add(result, newCall(bindSym"writeLine", bindSym"stdout", x))
- 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)
但是,符号 write , writeLine 和 stdout 已经绑定,不再被查找。如示例所示, bindSym 可以隐式地处理重载符号。