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();
}