• BindSym

    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 可以隐式地处理重载符号。