FuncLet
Ein FuncLet ist eine Referenz auf die Funktion eines Objekts. Damit können Funktionen als Argument übergeben werden.
Definiert wird ein Funclet mit
:{ Object.function }
Hier ein Beispiel:
::test = 2 + 98
x = :{ :this.test }
x.exec.print
Hier wird die Funktion "test" erzeugt und dann via FuncLet der Variable "x" zugewiesen. Die nächsten Zeile führt die Funktion mit ".exec" aus.
Wichtig:
Eine Funktion in einem FuncLet läuft in einer Sandbox und hat keinen Zugriff auf Variablen des umgebenden Objekts!
Werte übergeben
Es gibt zwei Möglichkeiten um Argumente an ein FuncLet zu übergeben.
Übergabe bei der Definition
Bei der Definition eines FuncLet können auch Argumente übergeben werden.
f = :{ "abc".add( "def" ) }
f.exec
Als Objekt kann jedes neu erzeugte Objekt oder "this" verwendet werden, somit natürlich auch atomare Typen.
In diesem Fall wird eine Verlinkung zu einem String und der Funktion ".add" geschaffen. Als Argument wird hier ein weiterer String übergeben weshalb bei ".exec" keine Argumente mehr übergeben werden können.
Das Ergebnis ist somit immer: "abcdef"
Übergabe bei der Ausführung
Werden keine Argumente definiert, müssen diese bei der Ausführung übergeben werden.
f = :{ "abc".add }
f.exec( "def" )
Das Ergebnis ist ebenso "abcdef", jedoch ist diese Variante weitaus flexibler. Hier lässt sich nämlich die selbe Funktion mit verschiedenen Argumenten aufrufen:
f.exec( "123" )
f.exec( 'z' )
f.exec( 987 )
Ein FuncLet ist ein Objekt
Da ein FuncLet ein normales Objekt ist, kann es an Funktionen übergeben oder von Funktionen zurückgegeben werden.
::myFunc1 = 6+4
::myFunc2( FuncLet fl )
func = 5 + fl.exec
::myFunc3 = :{ this.myFunc2 }
this.myFunc3.ifExec( :{ this.myFunc1 } ).print
ifExec
"Wenn das aktuelle Objekt ein FuncLet ist, führe die Funktion aus, ansonsten gib das aktuelle Objekt zurück."
Vor allem für die Kombination von FuncLet's und offenen Variablen existiert in "Object" die Funktion ".ifExec". Mit ".ifExec" wird, wenn das Objekt ein FuncLet ist, dieses per ".exec" ausgeführt. Ansonsten kommt das vorherige Objekt zurück. Für die Funktion benötigte Paramenter können übergeben werden:
::mySum( a, b ) = a + b
Object x = :{ this.mySum }
x.ifExec( 4, 6 ).print
x = 3
x.ifExec( 4, 6 ).print