Detail
#28935
TL-Script: Funktion als Ergebnis eines Attributs im Modell kann nicht auf Variable aus ihrem Kontext zugreifen
Es ist möglich mit der Speichervorschrift "Berechnung über TL-Skript" eine Funktion zurückzugeben, die dann mit Parametern angefüttert wird um z.B. einen Wert auszurechnen.
Dabei ist zu beachten, dass als Datentyp "Unspezifiziert" gewählt wird, und nicht "Suchausdruck" (unschön, aber unkritisch).
Ein Problem ergibt sich, wenn die zurückgelieferte Funktion ihrerseits bezug nimmt auf Variablen, die außerhalb definiert wurden. Es erscheint ein Fehler: "Zugriff auf undefinierte Variable ... .". Wenn der Zweck darin besteht aufwändige Berechnungen einmalig auszuführen und nur mit dem Ergebnis weiterzurechnen ist das somit nicht möglich.
== Beispiel Ein Projekt kenne die Kosteneinstufung "high" oder "low". Ein Kostensatz könne Werte für "high" oder "low" liefern. Das Projekt soll eine Berechnungsfunktion liefern, die einen Kostensatz als Parameter bekommt soll dann passend zum Projekt entweder den Wert von "high" oder "low" liefern.
// Variable in context of result function
classification = $project.get(`projectStructure:Project#costClassification`);
// Function computing a value based on the variable computed before.
cost-> switch {
"high".equals($classification): $cost.get(`exampleModule:Kostensatz#valueHigh`);
"low".equals($classification): $cost.get(`exampleModule:Kostensatz#valueLow`);
default: 0;
}
Die Funktion cost->..., die als Ergebnis geliefert wird, kann nicht auf einen Kostensatz angewendet werden, da beim Aufruf der Funktion außerhalb des Blocks aus dem sie zurückgegeben wird, nicht mehr auf die Variable $classification aus ihrem ursprünglichen Kontext zugegriffen werden kann.
Dies ist nur ein Beipsiel das einfach umgebaut werden kann, im allgemeinen will man aber auf Variablen aus dem Scope einer Funktion zugreifen können.
Test
Technisch:
{
increments = count(5).map(x -> y -> $y + $x);
count(5).map(n -> $increments[$n](0));
}
Das erwartete Ergebnis ist [0, 1, 2, 3, 4]. Aktuell wird fälschlicherweise [4, 4, 4, 4, 4] geliefert, weil die Inkrement-Funktion sich nicht ihren Kontext merkt.