mirror of
https://github.com/nim-lang/Nim.git
synced 2026-04-25 08:43:58 +00:00
Add proc [](n: NimNode, s: HSlice[T, U]): seq[NimNode] to macros (#7735)
fixes #7670.
This commit is contained in:
@@ -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
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()
|
||||
Reference in New Issue
Block a user