Closures in Wolfram Language

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

(* 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. *)

intSeq[] := Module[{i = 0},
  Function[i++; i]
]

(* 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. *)

nextInt = intSeq[]

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

Print[nextInt[]]
Print[nextInt[]]
Print[nextInt[]]

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

newInts = intSeq[]
Print[newInts[]]

In Wolfram Language, we use Module to create a local variable i that persists between function calls, simulating the closure behavior. The Function construct creates an anonymous function that increments and returns the value of i.

To run this code in Wolfram Language:

(* Evaluate the code in a Wolfram Language notebook or 
   use the Wolfram Engine command-line interface *)

1
2
3
1

The last feature of functions we’ll look at for now is recursion, which is also supported in Wolfram Language.