Tuples, Sets and Enums

10.1 Tuples

Tuples are structurally typed: same field names and types mean the same type.

let p = (name: "Ana", age: 30)          # named tuple
echo p.name, p[1]
let (n, a) = p                          # unpacking
type Person = tuple[name: string, age: int]
let anon = (1, "x", 2.0)                # anonymous tuple

10.2 Enums

{.pure.} enums require qualification (Color.Red). In Nim 2, enums are overloadable, so ambiguous names can be qualified.

holey enums (with gaps) can't be iterated safely.

type
  Color = enum
    Red, Green, Blue
  Status = enum
    sOk = "ok", sError = "error"         # custom string representation
  HttpCode = enum
    hc200 = 200, hc404 = 404

echo Red, " ", ord(Blue), " ", $sError, " ", Color.high, " ", succ(Red)
for c in Color: echo c
echo parseEnum[Color]("Green")          # std/strutils

10.3 Sets (Bit Sets of Ordinal Types)

Built-in sets are limited to small ordinals (≤ 2^16 elements). For general hash sets, use std/sets (HashSet, OrderedSet).

type Perm = enum pRead, pWrite, pExec
var perms: set[Perm] = {pRead, pWrite}
perms.incl pExec
perms.excl pWrite
echo pRead in perms, perms.card
let vowels = {'a', 'e', 'i', 'o', 'u'}
echo {1, 2, 3} + {3, 4}, {1, 2, 3} * {2, 3}, {1, 2, 3} - {1}   # union, intersection, difference
echo {1, 2} <= {1, 2, 3}                                         # subset