Closures in Nim

Nim supports anonymous functions, which can form closures. Anonymous functions are useful when you want to define a function inline without having to name it.

import std/strformat

proc intSeq(): proc(): int =
  var i = 0
  result = proc(): int =
    i += 1
    result = i

proc main() =
  let nextInt = intSeq()

  echo nextInt()
  echo nextInt()
  echo nextInt()

  let newInts = intSeq()
  echo newInts()

main()

This function intSeq returns another function, which we define anonymously in the body of intSeq. The returned function closes over the variable i to form a closure.

We call intSeq, assigning the result (a function) to nextInt. This function value captures its own i value, which will be updated each time we call nextInt.

See the effect of the closure by calling nextInt a few times.

To confirm that the state is unique to that particular function, create and test a new one.

When you run this program, you’ll see the following output:

1
2
3
1

The last feature of functions we’ll look at for now is recursion.