我正在运行 Windows 7,JMP 版本 12、13、14 和 15。
我正在使用包含顺序执行其他从属/嵌套脚本的代码的“包装器”脚本观察 JMP15 中的问题。
这些脚本是用 pre-15 版本编写的,并且可以在那里正常运行。这些包装器/嵌套脚本集合中的一些(但不是全部)无法在 JMP15 中正确运行。
如果单独运行,每个单独的脚本都能在 JMP15 中正确运行。
对于无法提交完整的脚本集,我深表歉意,但我已经提供了这两种类型的通用示例。
'wrapper' 脚本是通用形式:
//start wrapper.jsl
names default to here(1);
close all (data tables, no save);
clear log();
subordinate_scripts = {"subord1.jsl","subord2.jsl","subord3.jsl","subord4.jsl"};
for( i = 1, i <= n items(subordinate_scripts), i++,
beacon = 1; //variable gets set to 0 by last line of subordinate script
open(subordinate_scripts[i]);
if(beacon !=0,
write("\!NScript "||subordinate_scripts[i]||" did not successfully execute to completion.";
throw();
);
);
//end wrapper.jsl嵌套脚本 subord1.jsl 等具有通用形式
//! //start subord script so it will auto-execute when opened by wrapper.jsl
/* bunch of stuff, e.g.
aggregating multiple files
database queries
data processing / reshaping
saving large files
building extensive reports in the journal
executing other scripts
*/
beacon = 0;
//end subord script
从属脚本通过将 beacon 的值更改为 0 作为其最后一条指令,向包装器脚本发出完成执行信号。
如果beacon == 0,包装脚本开始FOR循环的下一个循环,打开下一个从属脚本。
我在 JMP15 中看到的表明以下事件顺序:
- 包装脚本开始
- 信标设置为 1
- 第一个从属脚本开始
- 包装脚本不等待从属脚本完成。
- 包装脚本执行继续到 IF 语句。
- 信标==1
- 打印消息说从属脚本失败(注意此时从属脚本已经在运行)
- 包装脚本停止
- 从属脚本成功执行完毕。
- 下一个从属脚本未打开,因为包装器已停止
JMP15 之前的版本中通常的事件顺序是
- 包装器开始
- 包装器设置信标 = 1
- 包装器打开下级脚本,然后空闲直到下级脚本完成
- 从属脚本运行,将 beacon = 0 设置为最后一条指令
- 包装器脚本检查信标值。
- 由于beacon ==0,执行FOR循环的下一个循环。
- 所有下级脚本依次运行。
有没有人建议让这个脚本习惯用法在 JMP15 中工作?
先感谢您。
谢谢你的回应,克雷奇。我将实施更多好的建议。非常感激。
我猜:信标变量有时是子脚本的本地变量。 也许涉及 NamesDefaultToHere。 快速测试表明 JMP 15做honor NamesDefaultToHere 当 JMP 14 没有时,它使信标成为子脚本的本地。@EvanMcCorkle @Audrey_Shull
file=savetextfile("$temp/xxx.jsl","//!
namesdefaulttohere(1);
xyzzy=42;show(xyzzy)");
open(file);
show(xyzzy);像文斯一样,我会用包括()而不是打开()为此,因为它不需要 //! .
您还可以使用 ::beacon 使其成为全局变量。
或者从拥有它的子脚本中删除 NamesDefaultToHere。
为什么 open() 和 include() 不再可以互换?