tuple unpacking is not enforced in for loops anymore

This commit is contained in:
Araq
2011-06-15 10:15:32 +02:00
parent 4fa80956b8
commit a15475f582
6 changed files with 40 additions and 4 deletions

View File

@@ -447,14 +447,16 @@ proc semFor(c: PContext, n: PNode): PNode =
result = semForFields(c, n, call.sons[0].sym.magic)
else:
var iter = skipTypes(n.sons[length-2].typ, {tyGenericInst})
if iter.kind != tyTuple:
# length == 3 means that there is one for loop variable
# and thus no tuple unpacking:
if iter.kind != tyTuple or length == 3:
if length != 3: GlobalError(n.info, errWrongNumberOfVariables)
var v = newSymS(skForVar, n.sons[0], c)
v.typ = iter
n.sons[0] = newSymNode(v)
addDecl(c, v)
else:
if length-2 != sonsLen(iter):
if length-2 != sonsLen(iter):
GlobalError(n.info, errWrongNumberOfVariables)
for i in countup(0, length - 3):
var v = newSymS(skForVar, n.sons[i], c)

View File

@@ -305,7 +305,10 @@ proc introduceNewLocalVars(c: PTransf, n: PNode): PTransNode =
proc transformYield(c: PTransf, n: PNode): PTransNode =
result = newTransNode(nkStmtList, n.info, 0)
var e = n.sons[0]
if skipTypes(e.typ, {tyGenericInst}).kind == tyTuple:
# c.transCon.forStmt.len == 3 means that there is one for loop variable
# and thus no tuple unpacking:
if skipTypes(e.typ, {tyGenericInst}).kind == tyTuple and
c.transCon.forStmt.len != 3:
e = skipConv(e)
if e.kind == nkPar:
for i in countup(0, sonsLen(e) - 1):

View File

@@ -0,0 +1,18 @@
type
TMatcherKind = enum
mkTerminal, mkSequence, mkAlternation, mkRepeat
TMatcher[T] = object
case kind: TMatcherKind
of mkTerminal:
value: T
of mkSequence, mkAlternation:
matchers: seq[TMatcher[T]]
of mkRepeat:
matcher: ref TMatcher[T]
min, max: int
var
m: ref TMatcher[int]

View File

@@ -0,0 +1,13 @@
iterator xrange(fromm, to: int, step = 1): tuple[x, y: int] =
var a = fromm
while a <= to:
yield (a, a+1)
inc(a, step)
for a, b in xrange(3, 7):
echo a, " ", b
for tup in xrange(3, 7):
echo tup

View File

@@ -3,7 +3,6 @@ High priority (version 0.8.12)
* implement message passing built-ins
* add --deadlock_prevention:on|off switch? timeout for locks?
* iterators should not always be destructive!
* real types for template results
* built-in serialization

View File

@@ -83,6 +83,7 @@ Additions
returns a ``TFile`` and raises an exception in case of an error.
- The compiler now might use hashing for string case statements depending
on the number of string literals in the case statement.
- Tuple unpacking is not enforced in ``for`` loops anymore.
- Added a wrapper for ``redis``.
- Added a wrapper for ``0mq`` via the ``zmq`` module.
- Added a wrapper for ``sphinx``.