Multi-Call
Mit Multi-Call lässt sich eine Funktion über die Argumente mehrfach und auch mit verschiedenen Werten aufrufen.
Ein Multi-Call wird durch 3 Punkte am Ende eines Arguments, welches eine Schleife enthalten muss, signalisiert.
this.print( 3.times... )
Da der Funktion ".print" ein Argument übergeben werden kann, eignet sich diese gut als Beispiel.
Als Ergebnis wird hier von 1 bis 3 gezählt und mit jeder Zahl die Print-Funktion aufgerufen:
1
2
3
Effektiv geschieht folgendes:
this.pass
it.print( 1 )
it.print( 2 )
it.print( 3 )
In diesem Beispiel wird das "Basis-Objekt" "this" ignoriert.
Aktuelles Objekt
Mit "cur" ist es möglich, das aktuelle Objekt zu verwenden.
3.print( cur.times... )
Hier wird die 3 mit "cur" an das Argument übergeben und damit die "times"-Funktion ausgeführt.
Die Ausgabe ist somit ebenfalls:
1
2
3
Eigene Funktion
Ebenso lässt sich damit eine selbst definierte Funktion mehrfach aufrufen:
::test( Int a )
"Called with {}!".fill( a ).print
this.test( 5.times... )
Vergleich zu Java-Lambda
Als Beispiel wird folgender Fall angenommen:
Es existieren 2 Tabellen mit gleicher Breite, wobei alle Zeilen aus Tabelle 1 in die Tabelle 2 eingefügt werden sollen.
In Java würde dies vielleicht so aussehen:
this.table1.forEach( a -> table2.add(a) );
In JayMo ließe sich dafür direkt die Funktion ".addAll" verwenden:
table1.addAll( table2 )
Aber zum Vergleich soll das Java-Beispiel nachgebaut werden.
Wird "table1" als Basis-Objekt verwendet, so würde der Befehl wie folgt aussehen:
table1.each.proc( :a, table2.add(a) )
Dreht man den Aufruf jedoch um und nutzt Multi-Call, so ergibt sich eine wesentlich kürzere Schreibweise:
table2.add( table1.each... )