Estoy ejecutando Windows 7, JMP versiones 12, 13, 14 y 15.
Estoy observando problemas en JMP15 con scripts 'wrapper' que contienen código para ejecutar secuencialmente otros scripts subordinados / anidados.
Estas secuencias de comandos se escribieron en versiones anteriores a la 15 y se ejecutan correctamente allí. Algunas, pero no todas, de estas colecciones de scripts de contenedor / anidados no se ejecutan correctamente en JMP15.
Cada uno de los scripts separados se ejecuta correctamente en JMP15 si se ejecuta individualmente.
Mis disculpas de antemano por no poder enviar un conjunto completo de scripts, pero he proporcionado ejemplos genéricos de ambos tipos.
El script 'wrapper' es de forma genérica:
//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.jslLos scripts anidados subord1.jsl, etc. son de forma genérica
//! //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
La secuencia de comandos subordinada señala la ejecución completa de la secuencia de comandos de contenedor cambiando el valor de beacon a 0 como última instrucción.
Si beacon == 0, el script de reiniciador inicia el siguiente ciclo del ciclo FOR y abre el siguiente script subordinado.
Lo que he visto en JMP15 sugiere el siguiente orden de eventos:
- comienza el script de envoltura
- baliza establecida en 1
- comienza el primer script subordinado
- la secuencia de comandos de contenedor NO espera a que finalice la secuencia de comandos subordinada.
- la ejecución del script de envoltura continúa hasta la instrucción IF.
- baliza == 1
- el mensaje se imprime diciendo que el script subordinado falló (Tenga en cuenta que el script subordinado ya se está ejecutando en este punto)
- secuencia de comandos de contenedor se detiene
- El script subordinado termina de ejecutarse con éxito.
- El siguiente script subordinado no se abre porque el contenedor se detuvo
El orden habitual de eventos en versiones anteriores a JMP15 es
- comienza la envoltura
- envoltorio establece baliza = 1
- el contenedor abre la secuencia de comandos subordinada, luego permanece inactiva hasta que finaliza la secuencia de comandos subordinada
- Se ejecuta un script subordinado, estableciendo beacon = 0 como última instrucción
- script de contenedor comprueba el valor de la baliza.
- desde beacon == 0, se ejecuta el siguiente ciclo del bucle FOR.
- Todos los scripts subordinados se ejecutan secuencialmente.
¿Alguien tiene una sugerencia para hacer que este lenguaje de secuencias de comandos funcione en JMP15?
Gracias de antemano.
Parece que deberías estar usando
incluir()
en lugar de
abierto()
¿Alguna idea de por qué open () e include () ya no son intercambiables?
Supongo: la variable beacon a veces es local para el subguión. Quizás NamesDefaultToHere está involucrado. Una prueba rápida sugiere que JMP 15 hace honrar NamesDefaultToHere que hace que la baliza sea local para el subguión cuando JMP 14 no lo hizo. @EvanMcCorkle @audrey_shull
file=savetextfile("$temp/xxx.jsl","//!
namesdefaulttohere(1);
xyzzy=42;show(xyzzy)");
open(file);
show(xyzzy);Como Vince, usaría incluir() más bien que abierto() para esto porque no necesita el //! .
También puede usar :: beacon para convertirlo en una variable global.
O elimine NamesDefaultToHere de los sub-scripts que lo tienen.
Gracias por la respuesta, Craige. Más buenos consejos que implementaré. Muy apreciado.