このトピックには既にいくつかのスレッドがあり、Scripting Guide にもセクションがありますが、私の質問に実際に答えるものはありません。
Main.jsl と Function.jsl の 2 つのファイルがあり、後者のファイルを前者に含めます。 Main.jsl の For ループ内で呼び出したい Function.jsl で定義された関数があります。 私が抱えていた問題は、呼び出された関数も For ループを使用し、Main.jsl の For ループと Function.jsl の関数の両方が i をカウント変数として使用するため、名前空間の汚染が発生することです。
いずれかのファイルのさまざまな場所で Names Default Here(1) を使用したり、Include() で << New Context 引数を使用したり、:: を使用して関数名をグローバル変数として定義したりするなど、さまざまな組み合わせを試しました。この問題を解決してみてください。 ただし、問題は常に、1) Main.jsl から Function.jsl の関数を呼び出すことができたが、名前空間の汚染が発生するか、2) Function.jsl から Function.jsl の関数を呼び出すことができないということでした。 Main.jsl は、アクセス方法がわからない名前空間またはスコープで Function が定義されていたためです。
私の現在の回避策は、 i と Local() 内の関数全体の内容を明示的に定義し、関数自体をグローバル変数として定義することです。
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 に名前空間を割り当ててから、これを使用して関数を呼び出すことができればより良いと思います。 また、理想的には、Main.jsl の i は名前空間 Here にあり、Function.jsl の i は名前空間 ns_function にあるため、名前空間の汚染も防ぐことができます。 しかし、これが可能かどうかはわかりません。
Windows 10 Enterprise 64 ビットで JMP Pro 16.2 (570548) を使用しています。