Steuer-Funktionen
Steuer-Funktionen bieten gegenüber normalen Funktionen eine erweiterte Funktionalität und können z.B. Blöcke mehrfach ausführen.
Eine typische Steuer-Funktion ist z.B. ".each".
Die Kontrolle dieser Steuer-Möglichkeiten findet über die magische Variable "func" statt.
Bitte zuvor folgenden Artikel lesen: "Fluß der Objekte"
Individuelle Verarbeitung
Die Funktion ".each" einer Liste verdeutlicht, dass hier die Verarbeitung etwas anders verläuft:
[3,9,2,6,8,1].each.print
Hier wird ".print" für jedes einzelne Element in der Liste ausgeführt. Die Funktion ".each" übernimmt also die Steuerung der weiteren Verarbeitung.
Solche Steuer-Funktionen lassen sich in JayMo auch selbst definieren. In diesem Fall werden die normalen Klammern "()" um ein zwei Ausrufezeichen ergänzt, was signalisiert dass diese Funktion besondere Eigenschaften besitzt.
::test()!! Int
Diese Funktion besitzt nun erweitere Fähigkeiten, weshalb Argumente extra initialisiert und die weitere Verarbeitung (Block/Stream) selbst angestoßen werden muss. Dies muss allerdings auch wirklich erfolgen, da ansonsten weder Argumente, noch Block oder Stream ausgeführt werden.
Die Möglichkeiten dazu bietet uns die magische Variable "func".
Argumente initialisieren
Durch die Steuer-Funktionalität müssen die Argumente selbst initialisiert werden:
func.init
Hiermit werden alle Argumente initialisiert. Durch die Übergabe einer Zahl, lassen sich einzelne Argumente initialisieren.
func.init(3)
_init init push
Weitere Verarbeitung
Info:
Als Block wird ein eingerückter Bereich bezeichnet, Stream steht für nachfolgende Funktionen.
Mit "func.hasBlock" und "func.hasStream" lässt sich prüfen, ob ein Block bzw. Stream beim aktuellen Aufruf vorhanden ist.
Mit "func.push" lässt sich ein Objekt zur weiteren Verarbeitung an Block und Stream senden:
::test()? Int
it = 7
func = func.push( it )
Hier wird das Objekt 7 an Push übergeben. Die 7 wandert somit durch den Block sowie den Stream weiter verarbeitet. Zurück kommt das Ergebnis dieser Verarbeitung, welches hier als Funktions-Ergebnis zurückgegeben wird.
In Verbindung mit einer Schleife kann so eine eigene ".each"-Funktion oder individuelle Schleife erstellt werden.
::myEach()? Int
7.times
func.push( it )
func = 7
Mittels Auto-Block-Funktion ist es so nun möglich, individuelle "Schlüsselwörter" wie z.B. "Count" selbst zu realisieren.