Tuple unpacking

In a var, let or const statement tuple unpacking can be performed. The special identifier _ can be used to ignore some parts of the tuple:

  1. proc returnsTuple(): (int, int, int) = (4, 2, 3)
  2. let (x, _, z) = returnsTuple()

This is treated as syntax sugar for roughly the following:

  1. let
  2. tmpTuple = returnsTuple()
  3. x = tmpTuple[0]
  4. z = tmpTuple[2]

For var or let statements, if the value expression is a tuple literal, each expression is directly expanded into an assignment without the use of a temporary variable.

  1. let (x, y, z) = (1, 2, 3)
  2. # becomes
  3. let
  4. x = 1
  5. y = 2
  6. z = 3

Tuple unpacking can also be nested:

  1. proc returnsNestedTuple(): (int, (int, int), int, int) = (4, (5, 7), 2, 3)
  2. let (x, (_, y), _, z) = returnsNestedTuple()