name(arguments){
...
}
name(arguments) single line
name(arguments) single line
Eine Funktion wird durch einer Klammer (Parameterliste) definiert, die Parameter enthalten kann. Zusätzlich kann die Klasse des Rückgabewertes festgesetzt werden, indem man eine Typisierung an die Parameterliste anhängt.
Jeder Parameter kann auch einen Standardwert besitzen, indem man eine Zuweisung in der Parameterliste anwendet.
Nachdem die jeweilige Funktion definiert wurde, kann man die Anweisungen durch das Erwähnen des Funktionsnamens und einer optionalen Parameterliste aufrufen.
Der Rückgabewert wird durch das Ergebnis der zuletzt ausgewerteten Anweisung bestimmt. Ebenfalls kann die return
-Anweisung zur bestimmung des Rückgabewertes verwendet werden.
factorial(n){
def ergebnis = 1
while(n > 1){
ergebnis *= n
n--
}
return ergebnis
}
Lokale Variablen werden durch die Anweisung def
definiert.
tell(name) out "My name is #(name)."
squared(x) = x*x
Das sog. Currying (bekannt aus Boo und Haskell) sorgt für die Weiterverarbeitung von überflüssigen Parametern. Werden mehr Parameter angegeben, als eine Funktion benötigt, so werden diese in einer Liste von Argumenten (definert als arguments
) behalten. Falls nun eine Funktion aufgerufen wird, ohne eine Parameterliste anzugeben, so wird der restliche Inhalt von arguments
weitergegeben.
put sum(a, b){
out a + b
}
put two sums(){ 'Benötigt keine Parameter
'Gibt sie aber an die weiteren Aufrufe weiter:
out "a + b = "
put sum
out "c + d = "
put sum
}
put two sums(2, 3, 1, 6)
>>> : a + b =
>>> : 5
>>> : c + d =
>>> : 7
Eine Funktion kann wiederholt aufgerufen werden, indem man weitere Parameterlisten an den jeweiligen Aufruf anhängt. Die Ergebnisse jedes Aufrufes werden in eine Queue geschrieben, die nach allen Aufrufen zurückgegeben wird. Bei Notwendigkeit kann ein Zwischenblock nach der jeweiligen Parameterliste angehängt werden, die das Ergebnis unabhängig von der Queue durch die Referenz value
auswertet.
squared(x) = x²
out squared(2)(3)(4) '= [4, 9, 16]
suqared(5){ out value }(6){ out value }
'Ausgabe: "25" und "36"
Für jeden Funktionsaufruf sind die Variablen namens self
und super
innerhalb des Funktionsblocks definiert. self
ist eine Referenz auf die Funktion selbst. Die Referenz super
ist auf die Gruppe gesetzt, in der die jeweilige Funktion definiert ist.
surname plus name() = super\surname + " " + super\name
myself{
surname = "Josef"
name = "Sniatecki"
full name -> surname plus name
}
brother{
surname = "Bernd"
name = "Sniatecki"
full name -> surname plus name
}
for(myself, brother){ out full name }
'Ausgabe: Josef Sniatecki, Bernd Sniatecki
In diesem Beispiel wird die Funktion surname plus name
nur einmal definiert. In den Gruppen myself
und brother
wird diese Funktion als Referenz aufgenommen. Durch super
besitzt man nun den Vorteil, dass sich der Funktionsaufruf am jeweiligen Parent-Objekt orientiert.