このトピックに関するスレッドはすでにいくつかあり、スクリプト ガイドにもセクションがありますが、私の質問に実際に答えられるものはありません。
Main.jsl と Function.jsl という 2 つのファイルがあり、後者のファイルを前者のファイルに含めます。 Function.jsl に定義された Function があり、Main.jsl の For ループ内で呼び出す必要があります。 私が抱えていた問題は、呼び出された Function も For ループを使用しており、Main.jsl の For ループと Function.jsl の Function の両方で i をカウント変数として使用しているため、名前空間汚染が発生するということです。
どちらかのファイルの異なる場所で Names Default Here(1) を使用し、Include() で << New Context 引数を使用し、さらに :: を使用して関数名をグローバル変数として定義するなど、多くの組み合わせを試しました。この問題を解決してみてください。 ただし、常に問題は、1) Main.jsl から Function.jsl の関数を呼び出すことはできましたが、名前空間汚染が発生する、または 2) Main.jsl から Function.jsl の関数を呼び出すことができない、のいずれかでした。 Main.jsl は、アクセス方法がわからない名前空間またはスコープで関数が定義されていたためです。
私の現在の回避策は、Local() 内で i と関数全体の内容を明示的に定義し、関数自体をグローバル変数として定義することです。
Main.jsl
Include("Function.jsl", << New Context);
Names Default To Here(1);
for(i = 1, i <= 10, i++,
returns = ::function(arguments);
);関数.jsl
::function = Function({arguments},
Local({i},
for(i = 1, i <= 20, i++,
Do Something;
);<BR /> Return(returns);
);
);私の質問は、これが本当に正しい方法なのかということです。 たとえば、returns = ns_function:function(arguments); のように、グローバル変数をいじるのではなく、Function.jsl に名前空間を割り当てて、これを使用して Function を呼び出すことができれば良いと思います。 そして理想的には、Main.jsl の i は名前空間 Here にあるのに対し、Function.jsl の i は名前空間 ns_function にあるため、これにより名前空間の汚染も防ぐことができます。 しかし、それがどのようにして可能なのか、あるいは可能なのかはわかりません。
Windows 10 Enterprise 64 ビットでの JMP Pro 16.2 (570548) の使用。
ありがとう! {Default Local} フラグを使用すると、これは私が望んでいたとおりに機能します。
この場合、 function({arguments}, {デフォルトのローカル} ) 関数内で使用されるすべてのスコープ外変数が関数に対してローカルであることを宣言します (これは私が 99% の場合行うことです)。
//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");
)
Function({引数}, <{ローカル変数}>, )>, スクリプト)