已经有几个关于这个主题的主题,以及脚本指南中的一个部分,但没有一个真正回答我的问题。
我有两个文件,Main.jsl 和 Function.jsl,我将后者包含在前者中。 我希望在 Main.jsl 的 For 循环中调用 Function.jsl 中定义的函数。 我遇到的问题是被调用的 Function 也使用了 For 循环,并且 Main.jsl 中的 For 循环和 Function.jsl 中的 Function 都使用 i 作为计数变量,因此这导致了命名空间污染。
我已经尝试了一堆组合,在两个文件的不同位置使用 Names Default Here(1),使用 Include() 中的 << New Context 参数,甚至使用 :: 将函数名称定义为全局变量,以便尝试解决这个问题。 但是,问题始终是:1)我能够从 Main.jsl 调用 Function.jsl 中的函数,但是会存在命名空间污染,或者 2)我无法调用 Function.jsl 中的函数Main.jsl 因为函数是在我不知道如何访问的命名空间或范围中定义的。
我当前的解决方法是在 Local() 中显式定义 i 和整个 Function 的内容,并将 Function 本身定义为全局变量,如下所示:
主.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);
);
);我的问题是:这真的是正确的方法吗? 例如,我认为如果我可以为 Function.jsl 分配一个命名空间,然后使用它来调用 Function 而不是弄乱全局变量,比如 return = ns_function:function(arguments); 会更好。 理想情况下,这也将防止命名空间污染,因为 Main.jsl 中的 i 在命名空间 Here 中,而 Function.jsl 中的 i 在命名空间 ns_function 中。 但我不知道如何/如果这是可能的。
在 Windows 10 Enterprise 64 位上使用 JMP Pro 16.2 (570548)。