Vordefinierte Funktionen

Eine vordefinierte Funktion in TL-Script hat einen bestimmten Namen, der global in allen Scripten bekannt ist. Eine vordefinierte Funktion wird direkt über ihren Namen aufgerufen, ohne sie vorher einer Variable zuzuweisen. Alle vordefinierten Funktion werden hier ausführlich beschrieben und man erhält Kontexthilfe zu der Funktion beim Tippen in einem Editor für TL-Script-Expressions.

Die Länge einer Zeichenkette kann beispielsweise über die Funktion length bestimmt werden (siehe Länge). Für vordefinierte Funktionen eine Reihe von Sonderregeln, beim Aufruf

Normaler Funktionsaufruf

Beim normalen Funktionsaufruf werden alle Parameter in der Funktionsklammer angegeben. Wenn es mehrere Parameter gibt, werden die Argumente mit Komma getrennt.

length("Hello world!")
subString("Hello world!", 6, 11)

Verketteter Funktionsaufruf

Funktionsaufrufe lassen sich verketten, ohne dass man die Aufrufe tief ineinanderschachteln muss. Dabei darf das erste Argument vor dem Funktionsnamen stehen. In dieser Schreibweise lässt sich leicht eine Kette von Verarbeitungsschritten aufbauen, bei dem das Ergebnis des letzten Verarbeitungsschrittes als Eingabe für den nächsten Schritt dient.

"Hello world!".substring(6, 11).length()

Gerade bei langen Verarbeitungsketten lässt sich so gut der Überblick behalten, wenn jeder Verarbeitungsschritt in eine neue Zeile geschrieben wird:

"Hello world!"
    .substring(6, 11)
    .length()

Hier wird zuerst von "Hello world!" die Zeichen zwischen dem 6. und 11. berechnet ("world") und von diesem Ergebnis die Länge bestimmt (5).

Auch ohne eine Kette zu bilden, darf das erste Argument immer vor dem Funktionsnamen stehen, z.B. in:

"Hello world!".length()

Diese Schreibweise ist äquivalent zu:

length("Hello world!")

Aufruf mit expliziter Verkettung

Eine Kette aus Funktionsaufrufen wie oben lässt sich nur bilden, wenn die letzte aufgerufene Funktion das passende Ergebnis für den nächsten Aufruf zurückliefert. Insbesondere bei der Objekterzeugung und Initialisierung ist das nicht der Fall. So liefert die set und add Funktion (siehe In Attributwert einfügen) kein Ergebnis. Mit normalem Funktionsaufruf müsste eine temporäre Variable eingefürt werden, um ein Objekt zu erzeugen, zu initialisieren und anschließend zu einer Referenz hinzuzufügen:

{
  obj = new(`MyType`);
  $obj.set(`MyType#myProp1`, $myValue1);
  $obj.set(`MyType#myProp2`, $myValue2);

  $otherObj.add(`OtherType#myRef`, $obj);
}

Mit expliziter Verkettung lässt sich aber auch z.B. Objektanlage und Initialisierung als ein Ausdruck ohne imperative Anweisungsliste ausdrücken:

$otherObj.add(`OtherType#myRef`, 
  new(`MyType`)
    ..set(`MyType#myProp1`, $myValue1)
    ..set(`MyType#myProp2`, $myValue2));

Der ".."-Operator sorgt dafür, dass das Ergebnis des Funktionsaufruf immer der Eingangswert (auf der linken Seite) ist, unabhängig davon, was die Funktion zurückliefert. So ist das Ergebnis von new(`MyType`)..set(`MyType#myProp1`, $myValue1) das neue Objekt (und nicht der Rückgabewert von set). Auf diesem kann dann die nächste Initialisierung durchgeführt werden und das Endergebnis (immer noch das neue Objekt) in eine Referenz eingefügt werden.

Aufruf mit benannten Argumenten (ab 7.6.0)

Manche Funktionen mit vielen Parametern unterstützen den Aufruf mit benannten Argumenten. Problematisch beim normalen Funktionsaufruf ist, dass man am Aufruf nicht mehr gut sehen kann, was das einzelne Argument bedeutet. So ist in subString("Hello world!", 6, 11) nicht klar, was genau 6 und 11 für eine Bedeutung haben. Daher kann man die übergebennen Argumente benennen:

subString("Hello world!", from: 6, to: 11)

Bei dieser Aufrufform kann man beliebige optionale Argumente weglassen. Beim normalen Funktionsaufruf darf man immer nur Argumente nach dem letzten angegebenen Argument weglassen.

subString("Hello world!", from: 6)

Hier ist nur der Startpunkt angegeben, das Ende ist implizit das Ende der Zeichenkette. Das Ergebnis ist "world!".

subString("Hello world!", to: 11)

Hier ist der Startpunkt weggelassen, der implizit am Anfang der Zeichenkette liegt. Das Ergebnis ist "Hello world".

Im Gegensatz dazu, können beim normalen Aufruf nur optionale Argumente am Ende weggelassen werden, da ja die Position der Argumente ihre Zuordnung zu den Funktionsparametern definiert. Mit normalem Funktionsaufruf kann man in diesem Fall also nur Ausschnitte ab einem bestimmten Zeichen (substring("Hello world!", 6)) aber nicht bis zu einem bestimmten Zeichen beschreiben.

Den Aufrufstil kann man in einem Aufruf mischen. Die ersten Parameter kann man über positionale Argumente und alle weiteren über benannte Argumente angeben. So wird im obigen Beispiel die Zeichenkette, von der der Ausschnitt vorgenommen werden soll, nicht benannt, sondern nur die Argument, die die Schnittpositionen definieren. Wichtig ist, dass nach dem ersten benannten Argument alle weiteren Argumente auch benannt sein müssen. Aus diesem Grund können Funktionen, die eine beliebige Anzahl von Argumenten unterstützen (wie z.B. In Zeichenkette umwandeln) nicht mit benannten Argumenten aufgerufen werden.