Closures in AngelScript

Our target language is AngelScript. Below is the explanation and translation of the given code example into AngelScript.

Go 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, defined anonymously in the body of intSeq. The returned function closes over the variable i to form a closure.

funcdef int IntFunc();

IntFunc@ intSeq() {
    int i = 0;
    return cast<IntFunc>(function int() {
        i++;
        return i;
    });
}

void main() {
    IntFunc@ nextInt = intSeq();
    print(nextInt()); // prints 1
    print(nextInt()); // prints 2
    print(nextInt()); // prints 3

    IntFunc@ newInts = intSeq();
    print(newInts()); // prints 1
}

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.