Fluß der Objekte
Block
Ein Block wird mit einem Tabulator eingerückt und direkt unter eine Funktion geschrieben. Wobei ein Block aus beliebig vielen Zeilen bestehen kann.
5.times
it.echo
it.print
Stream
Als "Stream" wird eine Funktion bezeichnet, die an einer Funktion angehängt ist und an die das Ergebnis (und ggf. des Blocks) übergeben wird. Ein Zeilenumbruch macht hier keinen Unterschied:
Objekt.funktion
.funktion.funktion
Konkretes Beispiel:
5.times
.echo.print
Oder:
5.times.echo.print
Ein Stream wird direkt oder auf der selben Ebene mit einem Punkt angehängt.
Block und Stream
Jede Funktion kann ggf. einen Block, jedoch immer eine nachfolgende Funktion (Stream) besitzen.
Objekt.funktion
Block
.stream
Konkret sieht dies z.B. so aus:
5.times
it.echo
.print
Hier wird das Objekt 5 erzeugt, die Funktion ".times" aufgerufen, welche auch einen Block haben darf. In diesem wird nun mit "it" das aktuelle Objekt des Blocks abgefragt und anschließend ausgegeben. Nach dem Block wird die Funktion ".print" aufgerufen.
So ist JayMo für einen guten Flow ausgelegt:
Objekt ... --> Funktion --> Block --> Stream (Funktion) --> ...
Auto-Block-Funktion
Wird ein Block direkt an ein Objekt angehängt, so wird die Auto-Block-Funktion aktiviert.
Loop
it.print
Break
Dies wird hier detaillierter beschrieben: "Auto-Block-Funktion"
Push-Optionen
Jede Funktion mit Steuer-Funktionalität hat generell drei Möglichkeiten:
- Weder Block noch Stream ausführen
- Ein Objekt auf den Weg durch Block und Stream zu senden
- Den Block zu überspringen und ein Objekt nur an den Stream zu senden
Hier wird z.B. der Block übersprungen und nur der Stream ausgeführt
If( false ).then
"Hello!".print
.print
Mehrfach
Anstatt einmal, wie bei "If", können Block und Stream oder nur der Stream auch mehrfach und mit unterschiedlichen Objekten ausgeführt werden.
5.times
it.echo
.print
Die Funktion ".times" hat die Aufgabe, entsprechend oft hoch zu zählen. Im obigen Beispiel wird somit das Objekt "1" erzeugt, an den Block übergeben und fließt weiter zum Stream. Danach wird das Objekt "2" erzeugt und ebenfalls an Block und Stream weitergegeben. Dann "3", "4" und "5".
Jedes Mal wird also ein Objekt erzeugt und wandert durch Block und Stream.
1 --> Block --> Stream --> ...
2 --> Block --> Stream --> ...
3 --> Block --> Stream --> ...
...
Veränderung
In den meisten Fällen wird ein Objekt unverändert durch Block und Stream fließen.
Es ist jedoch auch möglich, dass das Objekt im Block verändert oder ausgetauscht wird. Dies geschieht z.B. bei einem Fehler. In diesem Fall wird der Block abgebrochen und das aktuelle Objekt wird ersetzt durch das Fehler-Objekt. Dieses kann anschließend mit ".catch" ausgewertet werden.
Es ist aber auch möglich, das Objekt selbst zu ändern:
5.times
it = it + 3
.print
Mit "it" wird das aktuelle Objekt im Block ausgelesen. Mit "=" kann auch ein neuer Wert zugewiesen werden.
So kommt nun bei der Funktion ".print" nicht 1-5 an, sondern ein um 3 erhöhter Wert an!
Pass!
Gerade in längeren Stream-Ketten kann es vorkommen, dass ein Objekt etwas umfangreicher bearbeitet werden soll. Hierzu lässt sich z.B. ".pass" nutzen. Mit ".pass" wird das aktuelle Objekt an den Block (und weiter zum Stream) gesendet. Im Block kann "it" wie gewünscht verändert werden:
5.pass
a = it * 3
x = a + a - 2
it = x - 3
.print
Hier wird das Objekt 5 mit der Funktion ".pass" an den Block übergeben. Dort wird damit gearbeitet und als Ergebnis dem Block der neue Wert "25" zugewiesen. Am Ende vom Block wird die "25" an den Stream übergeben.
Mit ".print" wird in diesem Fall somit "25" ausgegeben.