Funktionen

Definition

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.

Beispiel (Mehrzeilig):

factorial(n){
  def ergebnis = 1
  
  while(n > 1){
    ergebnis *= n
    n--
  }
  return ergebnis
}

Lokale Variablen werden durch die Anweisung def definiert.

Beispiel (Einzeilig):

tell(name) out "My name is #(name)."

squared(x) = x*x

Currying

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.

Beispiel:

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

Multi-Calling

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.

Beispiel:

squared(x) = x²

out squared(2)(3)(4) '= [4, 9, 16]

suqared(5){ out value }(6){ out value }
'Ausgabe: "25" und "36"

Vordefinierte Objekte

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.

Beispiel:

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.

Top | Home | Index