In this tutorial we illustrate the closure mechanism. In fact like any entity in the language a function is a first class object. It means such kind of object can be viewed by a class. Then based on this approach a function can also be linked to a given set of behaviors provided by classes.
The array creation can be provided with a more expressive syntax using function as shown in the next code sample.
class multiArraysInline(System) implements Main {
start(args) {
int[][] multi =
new int[][10](int[] (int d) { return new int[d+1](d); });
for(int[] line : multi) {
for(int element : line) {
this.stdout().print(element.toString() + " ");
}
this.stdout().println();
}
}
}
The most important in this example is the capability to create a
closure with int[] (int d) { return new int[d+1](d);
}. Indeed since Clump is a strong typed language such closure
provides both a specification and an implementation.
The previous example defines an anonymous function and then is defined and used only once. Indeed such function can be linked to a variable. In this case it can be reused like any variable anytime it's required in the program.
class multiArrays(System) implements Main {
start(args) {
{int[] (int)} makeLine = int[] (int column) {
return new int[column+1](column);
};
int[][] multi = new int[][10](makeLine);
for(int[] line : multi) {
for(int element : line) {
this.stdout().print(element.toString() + " ");
}
this.stdout().println();
}
}
}
Such function referenced by a variable can be specified in a more
natural way as illustrated in the next example.
class multiArrays(System) implements Main {
start(args) {
int[] makeLine(int column) {
return new int[column+1](column);
};
int[][] multi = new int[][10](makeLine);
for(int[] line : multi) {
for(int element : line) {
this.stdout().print(element.toString() + " ");
}
this.stdout().println();
}
}
}
int[] makeLine(int column) {
return new int[column+1](column);
};
class multiArrays(System) implements Main {
start(args) {
int[][] multi = new int[][10](makeLine);
for(int[] line : multi) {
for(int element : line) {
this.stdout().print(element.toString() + " ");
}
this.stdout().println();
}
}
}
In this case this variable does en enclose any variable but it's
accessible from everywhere. Indeed such accessibility can be managed
using private declaration.
The previous example can be designed with a class protected method.
class multiArrays(System) implements Main, ILineMaker {
int[] makeLine(int column) {
return new int[column+1](column);
}
start(args) {
int[][] multi = new int[][10](makeLine);
for(int[] line : multi) {
for(int element : line) {
this.stdout().print(element.toString() + " ");
}
this.stdout().println();
}
}
}
In Clump Functions are objects but this concept hides in fact the closure mechanism. A closure was a function and a dedicated environment referencing variables. In such context programs can be dynamically created based on functionnal expression creation. This aspect is illustrated in the next example.
object NotFound {}
type Binder<K,V> = {V (K) throws NotFound}
interface IBinder<K,V> {
void set(K, V);
V get(K) throws NotFound;
}
class binder<K extends Equivalent<K>,V>(Binder<K,V>) implements IBinder<K,V> {
set(key,value) {
this = V (K j) throws NotFound {
if key == j {
return value;
} else {
return this(j);
}
};
}
get(i) {
return this(i);
}
}