Ich verwende Windows 7, JMP-Versionen 12, 13, 14 und 15.
Ich beobachte Probleme in JMP15 mit 'Wrapper'-Skripten, die Code enthalten, um andere untergeordnete/verschachtelte Skripte nacheinander auszuführen.
Diese Skripte wurden in Versionen vor 15 geschrieben und laufen dort ordnungsgemäß.Einige – aber nicht alle – dieser Wrapper/verschachtelten Skriptsammlungen werden in JMP15 nicht richtig ausgeführt.
Jedes der separaten Skripts wird in JMP15 korrekt ausgeführt, wenn es einzeln ausgeführt wird.
Ich entschuldige mich im Voraus dafür, dass ich keinen vollständigen Satz von Skripten einreichen kann, aber ich habe allgemeine Beispiele für beide Arten bereitgestellt.
Das 'Wrapper'-Skript hat die generische Form:
//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.jslDie verschachtelten Skripte subord1.jsl usw. sind von generischer Form
//! //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
Das untergeordnete Skript signalisiert dem Wrapper-Skript die vollständige Ausführung, indem es als letzte Anweisung den Wert von beacon auf 0 ändert.
Wenn beacon == 0, startet das Wrapper-Skript den nächsten Zyklus der FOR-Schleife und öffnet das nächste untergeordnete Skript.
Was ich in JMP15 gesehen habe, legt die folgende Reihenfolge der Ereignisse nahe:
- Wrapper-Skript startet
- Bake auf 1 gesetzt
- erstes untergeordnetes Skript startet
- Wrapper-Skript wartet NICHT darauf, dass das untergeordnete Skript beendet wird.
- Die Ausführung des Wrapper-Skripts wird mit der IF-Anweisung fortgesetzt.
- Leuchtfeuer ==1
- Es wird die Meldung ausgegeben, dass das untergeordnete Skript fehlgeschlagen ist (Beachten Sie, dass das untergeordnete Skript zu diesem Zeitpunkt bereits ausgeführt wird).
- Wrapper-Skript stoppt
- untergeordnetes Skript wird erfolgreich ausgeführt.
- Das nächste untergeordnete Skript wird nicht geöffnet, da der Wrapper gestoppt wurde
Die übliche Reihenfolge der Ereignisse in Versionen vor JMP15 ist
- Verpackung beginnt
- Wrapper setzt Beacon = 1
- Wrapper öffnet untergeordnetes Skript und bleibt dann im Leerlauf, bis das untergeordnete Skript beendet ist
- untergeordnetes Skript läuft, setzt als letzte Anweisung beacon = 0
- Wrapper-Skript prüft Beacon-Wert.
- da beacon ==0, wird der nächste Zyklus der FOR-Schleife ausgeführt.
- alle untergeordneten Skripte werden sequentiell ausgeführt.
Hat jemand einen Vorschlag, um diese Skriptsprache in JMP15 zum Laufen zu bringen?
Vielen Dank im Voraus.
Danke für die Antwort, Craige.Weitere gute Ratschläge, die ich umsetzen werde.Sehr geschätzt.
Ich vermute: Die Beacon-Variable ist manchmal lokal für das Unterskript. Vielleicht ist NamesDefaultToHere beteiligt. Ein Schnelltest legt nahe, dass JMP 15 tut Honor NamesDefaultToHere, wodurch Beacon lokal für das Unterskript wird, wenn JMP 14 dies nicht tat.@EvanMcCorkle @Audrey_Shull
file=savetextfile("$temp/xxx.jsl","//!
namesdefaulttohere(1);
xyzzy=42;show(xyzzy)");
open(file);
show(xyzzy);Wie Vince, würde ich verwenden enthalten() statt offen() dafür, weil es das // nicht braucht! .
Sie könnten auch ::beacon verwenden, um daraus eine globale Variable zu machen.
Oder entfernen Sie NamesDefaultToHere aus den untergeordneten Skripts, die es enthalten.
Irgendwelche Ideen, warum open() und include() nicht mehr austauschbar sind?
klingt wie Sie verwenden sollten
enthalten()
anstatt
offen()