Add proc [](n: NimNode, s: HSlice[T, U]): seq[NimNode] to macros (#7735)
fixes #7670.
This commit is contained in:
parent
95d79ac760
commit
37d88e5168
2 changed files with 50 additions and 0 deletions
|
|
@ -168,6 +168,18 @@ proc `[]`*(n: NimNode, i: int): NimNode {.magic: "NChild", noSideEffect.}
|
||||||
proc `[]`*(n: NimNode, i: BackwardsIndex): NimNode = n[n.len - i.int]
|
proc `[]`*(n: NimNode, i: BackwardsIndex): NimNode = n[n.len - i.int]
|
||||||
## get `n`'s `i`'th child.
|
## 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",
|
proc `[]=`*(n: NimNode, i: int, child: NimNode) {.magic: "NSetChild",
|
||||||
noSideEffect.}
|
noSideEffect.}
|
||||||
## set `n`'s `i`'th child to `child`.
|
## set `n`'s `i`'th child to `child`.
|
||||||
|
|
|
||||||
38
tests/macros/tslice.nim
Normal file
38
tests/macros/tslice.nim
Normal 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()
|
||||||
Loading…
Add table
Add a link
Reference in a new issue