Windows 7、JMPバージョン12、13、14、15を実行しています。
JMP15で、他の従属/ネストされたスクリプトを順番に実行するコードを含む「ラッパー」スクリプトの問題を観察しています。
これらのスクリプトは15以前のバージョンで記述されており、そこで適切に実行されます。 すべてではありませんが、これらのラッパー/ネストされたスクリプトコレクションの一部は、JMP15で正しく実行できません。
個別に実行すると、JMP15で個別のスクリプトが正しく実行されます。
スクリプトの完全なセットを送信できないことをおforびしますが、両方のタイプの一般的な例を提供しました。
「ラッパー」スクリプトは次の一般的な形式です。
//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
従属スクリプトは、最後の命令としてビーコンの値を0に変更することにより、ラッパースクリプトへの完全な実行を通知します。
ビーコン== 0の場合、ラッパースクリプトはFORループの次のサイクルを開始し、次の従属スクリプトを開きます。
JMP15で見たことは、次のイベントの順序を示唆しています。
- ラッパースクリプトの開始
- 1に設定されたビーコン
- 最初の従属スクリプトが開始します
- ラッパースクリプトは、下位のスクリプトが終了するまで待機しません。
- ラッパースクリプトの実行は、IFステートメントまで続きます。
- ビーコン== 1
- 下位スクリプトが失敗したというメッセージが出力されます(下位スクリプトはこの時点ですでに実行されていることに注意してください)
- ラッパースクリプトが停止する
- 従属スクリプトは正常に実行を終了します。
- ラッパーが停止したため、次の従属スクリプトは開かれません
JMP15以前のバージョンでのイベントの通常の順序は次のとおりです。
- ラッパー開始
- ラッパーセットビーコン= 1
- ラッパーは従属スクリプトを開き、従属スクリプトが終了するまでアイドル状態になります
- 下位スクリプトが実行され、ビーコン= 0が最後の命令として設定されます
- ラッパースクリプトはビーコン値をチェックします。
- ビーコン== 0であるため、FORループの次のサイクルが実行されます。
- すべての従属スクリプトは順番に実行されます。
このスクリプトのイディオムをJMP15で機能させるための提案はありますか?
前もって感謝します。
open()とinclude()がもはや互換性がない理由は何ですか?
私は推測します:ビーコン変数は、サブスクリプトに対してローカルな場合があります。たぶんNamesDefaultToHereが関係しています。簡単なテストでは、JMP 15 する JMP 14がサポートしていなかった場合、ビーコンをサブスクリプトに対してローカルにするNamesDefaultToHereを尊重します。 しゅうしゅう
file=savetextfile("$temp/xxx.jsl","//!
namesdefaulttohere(1);
xyzzy=42;show(xyzzy)");
open(file);
show(xyzzy);ビンスのように、私は使用します含める() のではなく開いた() これは//!を必要としないためです。。
:: beaconを使用してグローバル変数にすることもできます。
または、NamesDefaultToHereを含むサブスクリプトから削除します。
回答ありがとうございます、Craige。 私が実装するより良いアドバイス。 とても有難い。