diff options
author | Lolo Iccl <oxisccl@gmail.com> | 2018-11-10 22:10:50 +0900 |
---|---|---|
committer | Andreas Rumpf <rumpf_a@web.de> | 2018-11-10 14:10:50 +0100 |
commit | 37d88e5168508870d69a990e5002a9ea113843f9 (patch) | |
tree | 279cd29576383a0b2493424717cd3692e42dd99f | |
parent | 95d79ac760ce61f3ab09ace1a84c2eabde89e53c (diff) | |
download | Nim-37d88e5168508870d69a990e5002a9ea113843f9.tar.gz |
Add proc `[]`(n: NimNode, s: HSlice[T, U]): seq[NimNode] to macros (#7735)
fixes #7670.
-rw-r--r-- | lib/core/macros.nim | 12 | ||||
-rw-r--r-- | tests/macros/tslice.nim | 38 |
2 files changed, 50 insertions, 0 deletions
diff --git a/lib/core/macros.nim b/lib/core/macros.nim index 3011eaa67..2508a889e 100644 --- a/lib/core/macros.nim +++ b/lib/core/macros.nim @@ -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`. diff --git a/tests/macros/tslice.nim b/tests/macros/tslice.nim new file mode 100644 index 000000000..c64289ec6 --- /dev/null +++ b/tests/macros/tslice.nim @@ -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() |