diff options
-rw-r--r-- | compiler/lexer.nim | 6 | ||||
-rw-r--r-- | compiler/semstmts.nim | 9 | ||||
-rw-r--r-- | tests/parser/ttupleunpack.nim | 29 | ||||
-rw-r--r-- | web/news.txt | 2 |
4 files changed, 44 insertions, 2 deletions
diff --git a/compiler/lexer.nim b/compiler/lexer.nim index 694d6f4d7..0967bed1d 100644 --- a/compiler/lexer.nim +++ b/compiler/lexer.nim @@ -61,7 +61,7 @@ type tkComma, tkSemiColon, tkColon, tkColonColon, tkEquals, tkDot, tkDotDot, tkOpr, tkComment, tkAccent, - tkSpaces, tkInfixOpr, tkPrefixOpr, tkPostfixOpr, + tkSpaces, tkInfixOpr, tkPrefixOpr, tkPostfixOpr TTokTypes* = set[TTokType] @@ -863,6 +863,10 @@ proc rawGetTok*(L: var TLexer, tok: var TToken) = of '`': tok.tokType = tkAccent inc(L.bufpos) + of '_': + tok.tokType = tkSymbol + tok.ident = getIdent("_") + inc(L.bufpos) of '\"': # check for extended raw string literal: var rawMode = L.bufpos > 0 and L.buf[L.bufpos-1] in SymChars diff --git a/compiler/semstmts.nim b/compiler/semstmts.nim index e5777e2c1..a9331b75a 100644 --- a/compiler/semstmts.nim +++ b/compiler/semstmts.nim @@ -369,6 +369,10 @@ proc addToVarSection(c: PContext; result: var PNode; orig, identDefs: PNode) = else: result.add identDefs +proc isDiscardUnderscore(n: PNode): bool = + if n.kind != nkIdent: return false + return n.ident.s == "_" + proc semVarOrLet(c: PContext, n: PNode, symkind: TSymKind): PNode = var b: PNode result = copyNode(n) @@ -432,7 +436,10 @@ proc semVarOrLet(c: PContext, n: PNode, symkind: TSymKind): PNode = for j in countup(0, length-3): var v = semIdentDef(c, a.sons[j], symkind) - if sfGenSym notin v.flags: addInterfaceDecl(c, v) + if sfGenSym notin v.flags and + not isDiscardUnderscore(a.sons[j]): addInterfaceDecl(c, v) + if isDiscardUnderscore(a.sons[j]): + v.flags.incl(sfGenSym) when oKeepVariableNames: if c.inUnrolledContext > 0: v.flags.incl(sfShadowed) else: diff --git a/tests/parser/ttupleunpack.nim b/tests/parser/ttupleunpack.nim new file mode 100644 index 000000000..581e6e940 --- /dev/null +++ b/tests/parser/ttupleunpack.nim @@ -0,0 +1,29 @@ +discard """ + file: "ttupleunpack.nim" + output: "" + exitcode: 0 +""" + +proc main() = + + proc foo(): tuple[x, y, z: int] = + return (4, 2, 3) + + var (x, _, y) = foo() + doAssert x == 4 + doAssert y == 3 + + var (a, _, _) = foo() + doAssert a == 4 + + var (a, _, _xx) = foo() + doAssert a == 4 + + iterator bar(): tuple[x, y, z: int] = + yield (1,2,3) + + for x, y, _ in bar(): + doAssert x == 1 + doAssert y == 2 + +main() diff --git a/web/news.txt b/web/news.txt index 257591de7..b3453feaf 100644 --- a/web/news.txt +++ b/web/news.txt @@ -129,6 +129,8 @@ News of the assignment operator has arrived! - ``system.len`` for strings and sequences now returns 0 for nil. + - A single underscore can now be used to discard values when unpacking tuples. + Library additions ----------------- |