Extend list comprehension documentation

This commit is contained in:
def 2014-08-03 19:07:45 +02:00
commit c7898a0c81

View file

@ -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(