tuple unpacking is not enforced in for loops anymore

This commit is contained in:
Araq 2011-06-15 10:15:32 +02:00
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) result = semForFields(c, n, call.sons[0].sym.magic)
else: else:
var iter = skipTypes(n.sons[length-2].typ, {tyGenericInst}) 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) if length != 3: GlobalError(n.info, errWrongNumberOfVariables)
var v = newSymS(skForVar, n.sons[0], c) var v = newSymS(skForVar, n.sons[0], c)
v.typ = iter v.typ = iter
n.sons[0] = newSymNode(v) n.sons[0] = newSymNode(v)
addDecl(c, v) addDecl(c, v)
else: else:
if length-2 != sonsLen(iter): if length-2 != sonsLen(iter):
GlobalError(n.info, errWrongNumberOfVariables) GlobalError(n.info, errWrongNumberOfVariables)
for i in countup(0, length - 3): for i in countup(0, length - 3):
var v = newSymS(skForVar, n.sons[i], c) 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 = proc transformYield(c: PTransf, n: PNode): PTransNode =
result = newTransNode(nkStmtList, n.info, 0) result = newTransNode(nkStmtList, n.info, 0)
var e = n.sons[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) e = skipConv(e)
if e.kind == nkPar: if e.kind == nkPar:
for i in countup(0, sonsLen(e) - 1): 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 * implement message passing built-ins
* add --deadlock_prevention:on|off switch? timeout for locks? * add --deadlock_prevention:on|off switch? timeout for locks?
* iterators should not always be destructive!
* real types for template results * real types for template results
* built-in serialization * built-in serialization

View file

@ -83,6 +83,7 @@ Additions
returns a ``TFile`` and raises an exception in case of an error. returns a ``TFile`` and raises an exception in case of an error.
- The compiler now might use hashing for string case statements depending - The compiler now might use hashing for string case statements depending
on the number of string literals in the case statement. 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 ``redis``.
- Added a wrapper for ``0mq`` via the ``zmq`` module. - Added a wrapper for ``0mq`` via the ``zmq`` module.
- Added a wrapper for ``sphinx``. - Added a wrapper for ``sphinx``.