Es gibt bereits mehrere Threads zu diesem Thema sowie einen Abschnitt im Scripting Guide, aber keiner beantwortet meine Frage wirklich.
Ich habe zwei Dateien, Main.jsl und Function.jsl, und ich füge die letztere Datei in die erstere ein. In Function.jsl ist eine Funktion definiert, die ich innerhalb einer For-Schleife in Main.jsl aufrufen möchte. Das Problem, das ich hatte, ist, dass die aufgerufene Funktion auch eine For-Schleife verwendet und sowohl die For-Schleifen in Main.jsl als auch die Funktion in Function.jsl i als Zählvariable verwenden, was zu einer Namensraumverschmutzung führte.
Ich habe eine Reihe von Kombinationen mit der Verwendung von Names Default Here(1) an verschiedenen Stellen in beiden Dateien, der Verwendung des Arguments << New Context in Include() und sogar der Definition des Funktionsnamens als globale Variable mit :: ausprobiert, um dies zu erreichen Versuchen Sie, dieses Problem zu lösen. Das Problem bestand jedoch immer darin, dass entweder 1) ich die Funktion in Function.jsl von Main.jsl aus aufrufen konnte, es aber zu einer Namensraumverschmutzung kam, oder 2) ich die Funktion in Function.jsl nicht von dort aus aufrufen konnte Main.jsl, weil die Funktion in einem Namespace oder Bereich definiert wurde, auf den ich nicht zugreifen konnte.
Meine aktuelle Problemumgehung besteht darin, i und den Inhalt der gesamten Funktion innerhalb eines Local() explizit zu definieren und die Funktion selbst als solche als globale Variable zu definieren:
Main.jsl
Include("Function.jsl", << New Context);
Names Default To Here(1);
for(i = 1, i <= 10, i++,
returns = ::function(arguments);
);Funktion.jsl
::function = Function({arguments},
Local({i},
for(i = 1, i <= 20, i++,
Do Something;
);<BR /> Return(returns);
);
);Meine Frage ist: Ist das wirklich der richtige Weg? Ich denke zum Beispiel, dass es besser wäre, wenn ich Function.jsl einen Namespace zuweisen und diesen dann verwenden könnte, um die Funktion aufzurufen, anstatt mit globalen Variablen herumzuspielen, wie etwa „returns = ns_function:function(arguments);“. Und im Idealfall würde dies dann auch die Namespace-Verschmutzung verhindern, da das i in Main.jsl im Namespace Here liegt, während das i in Function.jsl im Namespace ns_function liegt. Aber ich weiß nicht, wie/ob das möglich ist.
Verwendung von JMP Pro 16.2 (570548) unter Windows 10 Enterprise 64-Bit.
Danke schön! Mit dem Flag {Default Local} funktioniert das genau so, wie ich es wollte.
In diesem Fall könnten Sie auch funktionieren({arguments}, {Standardlokal} ), um zu deklarieren, dass alle in der Funktion verwendeten Variablen ohne Gültigkeitsbereich lokal für die Funktion sind (das mache ich in 99 % der Fälle).
//main.jsl
Names Default To Here(1);
Include("test.jsl");
For(i = 1, i <= 5, i++,
testparam = i;
return = test();
show(i);
show(return);
);
//test.jsl
Names Default To Here(1);
test = function({}, {Default Local},
For(i = 1, i <= 20, i++,
show(i);
);
show(testparam);
return("done");
)
Funktion({Argumente}, <{lokale Variablen}>, )>, Skript)