- For循环宏
For循环宏
一个宏作为唯一的输入参数,特殊类型 system.ForLoopStmt 的表达式可以重写整个 for 循环:
- import macros
- {.experimental: "forLoopMacros".}
- macro enumerate(x: ForLoopStmt): untyped =
- expectKind x, nnkForStmt
- # 我们剥离第一个for循环变量并将其用作整数计数器:
- result = newStmtList()
- result.add newVarStmt(x[0], newLit(0))
- var body = x[^1]
- if body.kind != nnkStmtList:
- body = newTree(nnkStmtList, body)
- body.add newCall(bindSym"inc", x[0])
- var newFor = newTree(nnkForStmt)
- for i in 1..x.len-3:
- newFor.add x[i]
- # 将枚举(X)转换为'X'
- newFor.add x[^2][1]
- newFor.add body
- result.add newFor
- # 现在将整个宏包装在一个块中以创建一个新的作用域
- result = quote do:
- block: `result`
- for a, b in enumerate(items([1, 2, 3])):
- echo a, " ", b
- # 没有将宏包装在一个块中,我们需要在这里为 `a` 和 `b` 选择不同的名称以避免重定义错误
- for a, b in enumerate([1, 2, 3, 5]):
- echo a, " ", b
目前,必须通过 {.experimental: "forLoopMacros".} 显式启用循环宏。