Closures/Lambdas

Anonymous functions are defined using the fun keyword:

fun foo(f: fun(a:Int):Int) {
    f(1)
}

foo(fun(a:Int):Int{
    printf("%d\n", a)
    return a + 1
});

Return type inference is not yet supported for closures - the return type must be explicitly specified.

Variable Capture

By default, external variables are captured by value:

var i = 0
var f = fun(a:Int):Int{
    return a + i
};

Static Closures

Static closures are state-less closures marked with static. They cannot capture variables:

var f : fun(a:Int) static : Int

Reference Capture

C++-style reference capture is not supported. For reference capture, you need to explicitly take the address:

var i = 0
var ri = &i
var f = fun(a:Int):Int{
    return a + *ri
};

Move Capture

C++-style move capture is not supported. Use AutoMove to wrap objects and avoid explicit move instructions:

var arr: DArray
var autoMove = AutoMove { .set(arr) }

var f = fun() {
    var s = autoMove.get().size()
}