J'utilise Windows 7, JMP versions 12, 13, 14 et 15.
J'observe des problèmes dans JMP15 avec des scripts "wrapper" qui contiennent du code pour exécuter séquentiellement d'autres scripts subordonnés/imbriqués.
Ces scripts ont été écrits dans des versions antérieures à 15 et s'y exécutent correctement.Certaines - mais pas toutes - de ces collections de scripts wrapper/imbriquées ne s'exécutent pas correctement dans JMP15.
Chacun des scripts séparés s'exécute correctement dans JMP15 s'il est exécuté individuellement.
Mes excuses à l'avance de ne pas pouvoir soumettre un ensemble complet de scripts, mais j'ai fourni des exemples génériques des deux types.
Le script 'wrapper' est de la forme générique :
//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.jslLes scripts imbriqués subord1.jsl, etc. sont de la forme générique
//! //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
Le script subordonné signale l'exécution complète au script wrapper en changeant la valeur de beacon en 0 comme dernière instruction.
Si beacon == 0, le script wrapper démarre le cycle suivant de la boucle FOR et ouvre le script subordonné suivant.
Ce que j'ai vu dans JMP15 suggère l'ordre suivant des événements :
- le script wrapper démarre
- balise réglée sur 1
- le premier script subordonné commence
- le script wrapper n'attend PAS que le script subordonné se termine.
- l'exécution du script wrapper continue jusqu'à l'instruction IF.
- balise ==1
- un message est imprimé indiquant que le script subordonné a échoué (notez que le script subordonné est déjà en cours d'exécution à ce stade)
- le script wrapper s'arrête
- le script subordonné finit de s'exécuter avec succès.
- Le script subordonné suivant n'est pas ouvert car le wrapper s'est arrêté
L'ordre habituel des événements dans les versions antérieures à JMP15 est
- l'emballage commence
- wrapper définit balise = 1
- wrapper ouvre le script subordonné, puis reste inactif jusqu'à ce que le script subordonné se termine
- le script subordonné s'exécute, définissant beacon = 0 comme dernière instruction
- le script wrapper vérifie la valeur de la balise.
- puisque beacon ==0, le cycle suivant de la boucle FOR est exécuté.
- tous les scripts subordonnés sont exécutés séquentiellement.
Quelqu'un a-t-il une suggestion pour faire fonctionner cet idiome de script dans JMP15 ?
Merci d'avance.
Merci pour la réponse, Craige.Encore de bons conseils que je vais appliquer.Très appréciée.
Je devine : la variable beacon est parfois locale au sous-script. Peut-être que NamesDefaultToHere est impliqué. Un test rapide suggère que JMP 15 fait honorez NamesDefaultToHere qui rend la balise locale au sous-script lorsque JMP 14 ne l'a pas fait.@EvanMcCorkle @Audrey_Shul
file=savetextfile("$temp/xxx.jsl","//!
namesdefaulttohere(1);
xyzzy=42;show(xyzzy)");
open(file);
show(xyzzy);Comme Vince, j'utiliserais inclure() plutôt que ouvrir() pour cela car il n'a pas besoin du //! .
Vous pouvez également utiliser ::beacon pour en faire une variable globale.
Ou supprimez le NamesDefaultToHere des sous-scripts qui l'ont.
Des idées pour lesquelles open() et include() ne sont plus interchangeables ?
on dirait que vous devriez utiliser
inclure()
au lieu de
ouvrir()