tuple unpacking is not enforced in for loops anymore
This commit is contained in:
parent
4fa80956b8
commit
a15475f582
6 changed files with 40 additions and 4 deletions
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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):
|
||||||
|
|
|
||||||
18
tests/accept/compile/tgenericmatcher2.nim
Normal file
18
tests/accept/compile/tgenericmatcher2.nim
Normal 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]
|
||||||
|
|
||||||
|
|
||||||
13
tests/accept/compile/titer_no_tuple_unpack.nim
Normal file
13
tests/accept/compile/titer_no_tuple_unpack.nim
Normal 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
|
||||||
|
|
||||||
1
todo.txt
1
todo.txt
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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``.
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue