Add proc [](n: NimNode, s: HSlice[T, U]): seq[NimNode] to macros (#7735)

fixes #7670.
This commit is contained in:
Lolo Iccl
2018-11-10 22:10:50 +09:00
committed by Andreas Rumpf
parent 95d79ac760
commit 37d88e5168
2 changed files with 50 additions and 0 deletions

View File

@@ -168,6 +168,18 @@ proc `[]`*(n: NimNode, i: int): NimNode {.magic: "NChild", noSideEffect.}
proc `[]`*(n: NimNode, i: BackwardsIndex): NimNode = n[n.len - i.int]
## get `n`'s `i`'th child.
template `^^`(n: NimNode, i: untyped): untyped =
(when i is BackwardsIndex: n.len - int(i) else: int(i))
proc `[]`*[T, U](n: NimNode, x: HSlice[T, U]): seq[NimNode] =
## slice operation for NimNode.
## returns a seq of child of `n` who inclusive range [n[x.a], n[x.b]].
let xa = n ^^ x.a
let L = (n ^^ x.b) - xa + 1
result = newSeq[NimNode](L)
for i in 0..<L:
result[i] = n[i + xa]
proc `[]=`*(n: NimNode, i: int, child: NimNode) {.magic: "NSetChild",
noSideEffect.}
## set `n`'s `i`'th child to `child`.

38
tests/macros/tslice.nim Normal file
View File

@@ -0,0 +1,38 @@
import macros
macro test(): untyped =
result = nnkStmtList.newTree()
let n = nnkStmtList.newTree(
newIdentNode("one"),
newIdentNode("two"),
newIdentNode("three"),
newIdentNode("four"),
newIdentNode("five"),
newIdentNode("six")
)
var i = 1
for x in n[1 .. ^2]:
assert x == n[i]
i.inc
assert i == 5
i = 3
for x in n[3..^1]:
assert x == n[i]
i.inc
assert i == 6
i = 0
for x in n[0..3]:
assert x == n[i]
i.inc
assert i == 4
i = 0
for x in n[0..5]:
assert x == n[i]
i.inc
assert i == 6
test()