Extend list comprehension documentation
This commit is contained in:
parent
9f99dd0196
commit
c7898a0c81
1 changed files with 20 additions and 16 deletions
|
|
@ -119,35 +119,39 @@ macro `->`*(p, b: expr): expr {.immediate.} =
|
||||||
type ListComprehension = object
|
type ListComprehension = object
|
||||||
var lc*: ListComprehension
|
var lc*: ListComprehension
|
||||||
|
|
||||||
macro `[]`*(lc: ListComprehension, x, t): expr =
|
macro `[]`*(lc: ListComprehension, comp, typ: expr): expr =
|
||||||
## List comprehensions.
|
## List comprehension, returns a sequence. `comp` is the actual list
|
||||||
|
## comprehension, for example ``x | (x <- 1..10, x mod 2 == 0)``. `typ` is
|
||||||
|
## the type that will be stored inside the result seq.
|
||||||
##
|
##
|
||||||
## .. code-block:: nimrod
|
## .. code-block:: nimrod
|
||||||
##
|
##
|
||||||
|
## echo lc[x | (x <- 1..10, x mod 2 == 0), int]
|
||||||
|
##
|
||||||
## const n = 20
|
## const n = 20
|
||||||
## echo lc[(x,y,z) | (x <- 1..n, y <- x..n, z <- y..n, x*x + y*y == z*z),
|
## echo lc[(x,y,z) | (x <- 1..n, y <- x..n, z <- y..n, x*x + y*y == z*z),
|
||||||
## tuple[a,b,c: int]]
|
## tuple[a,b,c: int]]
|
||||||
|
|
||||||
expectLen(x, 3)
|
expectLen(comp, 3)
|
||||||
expectKind(x, nnkInfix)
|
expectKind(comp, nnkInfix)
|
||||||
expectKind(x[0], nnkIdent)
|
expectKind(comp[0], nnkIdent)
|
||||||
assert($x[0].ident == "|")
|
assert($comp[0].ident == "|")
|
||||||
|
|
||||||
result = newCall(
|
result = newCall(
|
||||||
newDotExpr(
|
newDotExpr(
|
||||||
newIdentNode("result"),
|
newIdentNode("result"),
|
||||||
newIdentNode("add")),
|
newIdentNode("add")),
|
||||||
x[1])
|
comp[1])
|
||||||
|
|
||||||
for i in countdown(x[2].len-1, 0):
|
for i in countdown(comp[2].len-1, 0):
|
||||||
let y = x[2][i]
|
let x = comp[2][i]
|
||||||
expectKind(y, nnkInfix)
|
expectKind(x, nnkInfix)
|
||||||
expectMinLen(y, 1)
|
expectMinLen(x, 1)
|
||||||
if y[0].kind == nnkIdent and $y[0].ident == "<-":
|
if x[0].kind == nnkIdent and $x[0].ident == "<-":
|
||||||
expectLen(y, 3)
|
expectLen(x, 3)
|
||||||
result = newNimNode(nnkForStmt).add(y[1], y[2], result)
|
result = newNimNode(nnkForStmt).add(x[1], x[2], result)
|
||||||
else:
|
else:
|
||||||
result = newIfStmt((y, result))
|
result = newIfStmt((x, result))
|
||||||
|
|
||||||
result = newNimNode(nnkCall).add(
|
result = newNimNode(nnkCall).add(
|
||||||
newNimNode(nnkPar).add(
|
newNimNode(nnkPar).add(
|
||||||
|
|
@ -158,7 +162,7 @@ macro `[]`*(lc: ListComprehension, x, t): expr =
|
||||||
newNimNode(nnkFormalParams).add(
|
newNimNode(nnkFormalParams).add(
|
||||||
newNimNode(nnkBracketExpr).add(
|
newNimNode(nnkBracketExpr).add(
|
||||||
newIdentNode("seq"),
|
newIdentNode("seq"),
|
||||||
t)),
|
typ)),
|
||||||
newEmptyNode(),
|
newEmptyNode(),
|
||||||
newEmptyNode(),
|
newEmptyNode(),
|
||||||
newStmtList(
|
newStmtList(
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue