summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorLolo Iccl <oxisccl@gmail.com>2018-11-10 22:10:50 +0900
committerAndreas Rumpf <rumpf_a@web.de>2018-11-10 14:10:50 +0100
commit37d88e5168508870d69a990e5002a9ea113843f9 (patch)
tree279cd29576383a0b2493424717cd3692e42dd99f
parent95d79ac760ce61f3ab09ace1a84c2eabde89e53c (diff)
downloadNim-37d88e5168508870d69a990e5002a9ea113843f9.tar.gz
Add proc `[]`(n: NimNode, s: HSlice[T, U]): seq[NimNode] to macros (#7735)
fixes #7670.
-rw-r--r--lib/core/macros.nim12
-rw-r--r--tests/macros/tslice.nim38
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()