Nim: Data Structures

Nim: Data Structures

More complex data structures can be defined via a type statement:

type
  State = enum
    Victoria, NewSouthWales, Queensland, Tasmania, SouthAustralia, NorthernTerritory, WesternAustralia, ACT

var home = Victoria

echo home
# Victoria

echo typeof home
# State

Arrays in Nim are of fixed length with their size specificed at compile time. Sequences are like arrays, but have a dynamic length. They can be constructed by the array constructor [] in conjunction with the array to sequence operator @.

var
  x: seq[int] # a reference to a sequence of integers
x = @[1, 2, 3, 4, 5, 6]

There’s also openarrays, though they can only be used as parameters:

proc openArraySize(oa: openArray[string]): int =
  oa.len

Creating a custom object is done by defining a new type, with a type of object:

type
  Person = object
    name: string
    age: int

var person1 = Person(name: "Peter", age: 30)

echo person1.name # "Peter"
echo person1.age  # 30

Mark fields that should be visible from outside the defining module with *.

type
  Person* = object # the type is visible from other modules
    name*: string  # the field of this type is visible from other modules
    age*: int

A similar but alternate approach for object-like behaviour is to use tuples:

type
  Person = tuple[name: string, age: int]

var
  person: Person

person = (name: "Peter", age: 30)

Published: 21/03/2022

Hi, I'm Glenn! 👋

I've spent most of my career working with or at startups. I'm currently the VP of Product / GTM @ Ockam where I'm helping developers build applications and systems that are secure-by-design. It's time we started securely connecting apps, not networks.

Previously I led the Terraform product team @ HashiCorp, where we launched Terraform 1.0, Terraform Cloud, and a whole host of amazing capabilities that set the stage for a successful IPO. Prior to that I was part of the Startup Team @ AWS, and earlier still an early employee @ Heroku. I've also invested in a couple of dozen early stage startups.