mirror of
https://github.com/nim-lang/Nim.git
synced 2025-12-28 17:04:41 +00:00
* type annotations for variable tuple unpacking, better error messages closes #17989, closes https://github.com/nim-lang/RFCs/issues/339 * update grammar * fix test
95 lines
2.6 KiB
Nim
95 lines
2.6 KiB
Nim
proc returnsTuple(): (int, int, int) = (4, 2, 3)
|
|
|
|
proc main2 =
|
|
let (x, _, z) = returnsTuple()
|
|
|
|
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 (aa, _, _) = foo()
|
|
doAssert aa == 4
|
|
|
|
iterator bar(): tuple[x, y, z: int] =
|
|
yield (1,2,3)
|
|
|
|
for x, y, _ in bar():
|
|
doAssert x == 1
|
|
doAssert y == 2
|
|
|
|
main()
|
|
main2()
|
|
|
|
block: # nested unpacking
|
|
block: # simple let
|
|
let (a, (b, c), d) = (1, (2, 3), 4)
|
|
doAssert (a, b, c, d) == (1, 2, 3, 4)
|
|
let foo = (a, (b, c), d)
|
|
let (a2, (b2, c2), d2) = foo
|
|
doAssert (a, b, c, d) == (a2, b2, c2, d2)
|
|
|
|
block: # var and assignment
|
|
var (x, (y, z), t) = ('a', (true, @[123]), "abc")
|
|
doAssert (x, y, z, t) == ('a', true, @[123], "abc")
|
|
(x, (y, z), t) = ('b', (false, @[456]), "def")
|
|
doAssert (x, y, z, t) == ('b', false, @[456], "def")
|
|
|
|
block: # very nested
|
|
let (_, (_, (_, (_, (_, a))))) = (1, (2, (3, (4, (5, 6)))))
|
|
doAssert a == 6
|
|
|
|
block: # const
|
|
const (a, (b, c), d) = (1, (2, 3), 4)
|
|
doAssert (a, b, c, d) == (1, 2, 3, 4)
|
|
const foo = (a, (b, c), d)
|
|
const (a2, (b2, c2), d2) = foo
|
|
doAssert (a, b, c, d) == (a2, b2, c2, d2)
|
|
|
|
block: # evaluation semantics preserved between literal and not literal
|
|
var s: seq[string]
|
|
block: # literal
|
|
let (a, (b, c), d) = ((s.add("a"); 1), ((s.add("b"); 2), (s.add("c"); 3)), (s.add("d"); 4))
|
|
doAssert (a, b, c, d) == (1, 2, 3, 4)
|
|
doAssert s == @["a", "b", "c", "d"]
|
|
block: # underscore
|
|
s = @[]
|
|
let (a, (_, c), _) = ((s.add("a"); 1), ((s.add("b"); 2), (s.add("c"); 3)), (s.add("d"); 4))
|
|
doAssert (a, c) == (1, 3)
|
|
doAssert s == @["a", "b", "c", "d"]
|
|
block: # temp
|
|
s = @[]
|
|
let foo = ((s.add("a"); 1), ((s.add("b"); 2), (s.add("c"); 3)), (s.add("d"); 4))
|
|
let (a, (b, c), d) = foo
|
|
doAssert (a, b, c, d) == (1, 2, 3, 4)
|
|
doAssert s == @["a", "b", "c", "d"]
|
|
|
|
block: # unary assignment unpacking
|
|
var a: int
|
|
(a,) = (1,)
|
|
doAssert a == 1
|
|
|
|
block: # type annotations
|
|
block: # basic
|
|
let (a, b): (int, int) = (1, 2)
|
|
doAssert (a, b) == (1, 2)
|
|
block: # type inference
|
|
let (a, b): (byte, float) = (1, 2)
|
|
doAssert (a, b) == (1.byte, 2.0)
|
|
block: # type mismatch
|
|
doAssert not (compiles do:
|
|
let (a, b): (int, string) = (1, 2))
|
|
block: # nested
|
|
let (a, (b, c)): (int, (int, int)) = (1, (2, 3))
|
|
doAssert (a, b, c) == (1, 2, 3)
|
|
block: # nested type inference
|
|
let (a, (b, c)): (byte, (float, cstring)) = (1, (2, "abc"))
|
|
doAssert (a, b, c) == (1.byte, 2.0, cstring"abc")
|