Re: Comportamiento de variables en funciones JSLgzmorgan, gracias por la información. La solución actual de window() parecía que podría ser la solución más simple, pero no funcionó para mí... al menos, no de la forma en que traté de codificarla. Traté de usar principalmente el comando eval sub() para la mayoría de las variables, que funciona, pero no funciona para nw (mi nueva variable de ventana) o _cw para la ventana actual. Probablemente me perdí algo, pero está bien.
Terminé volviendo a su otra sugerencia, que Vince había sugerido anteriormente, el espacio de nombres de la ventana. No he tenido ningún problema con él hasta ahora.
Con respecto al generador de aplicaciones, lo conozco pero no lo he usado. Por lo general, solo codifico mi propia GUI y funciones, y creo el complemento manualmente. Me costó entender la función set y this (o self) y qué estaba llamando a qué, pero creo que ahora veo... Voy a echar un vistazo más de cerca.
Gracias a todos por las entradas. Realmente aprecio los diferentes enfoques/sugerencias. Mi secuencia de comandos toma un conjunto de parámetros relacionados y los traza de diferentes maneras, pero toma un par de minutos configurarlo y hacer clic manualmente en los parámetros y luego exportarlo. Con estas actualizaciones y el bucle desde un archivo maestro, puedo llamar al script desde un script de llamada separado en lugar de la GUI, y hacer que genere no un conjunto de gráficos sino N gráficos. Antes me tomaba un par de horas... ahora son diez segundos.Por supuesto, me tomó mucho tiempo llegar aquí, pero puedo reutilizar esto durante años.
Re: Comportamiento de variables en funciones JSL¡ups!Olvidé mencionar que, en lugar de "esto" y los espacios de nombres de las ventanas, también puede hacer referencia a la ventana actual.Adjunté el guión alternativo,
Re: Comportamiento de variables en funciones JSLIba a sugerir usar el espacio de nombres de la ventana, que es una buena sugerencia.Por lo general, no uso funciones para las ventanas de la interfaz de usuario.Otro método para referirse a objetos locales es usar la función Establecer y controlar esto. El guión está debajo.Usé declaraciones de impresión más simples.Es posible que desee explorar el uso de Application Builder, se necesita una pequeña inversión para aprender cómo funciona, pero puede ser útil.
names default to here(1);
myFun = Function({A, Z},{Default Local},
A[2] = 10;
B = 2*A;
show (A);
show(B);
show(Z);
nw = new window("test",
vlistbox(
textbox(Z),
textbox(char(B)),
buttonbox("Show array B (works)",
<<SET function=""></SET>Re: Comportamiento de variables en funciones JSLGracias Vince. No sabía sobre el espacio de nombres de la ventana. Eso podría funcionar bien, lo intentaré.
En este momento tengo mi parte GUI en un archivo, y tengo la intención de pasar las variables a lo que llamaré la función principal. Llamaría a la GUI desde una barra de herramientas adicional o ejecutaría un pequeño script personalizado que recorrería N veces, llamando al script principal para N conjuntos de parámetros de entrada. La reutilización podría ser un problema aquí, pero sobrescribir las variables puede no importar... Veré cómo va. Gracias por tu ayuda.
Re: Comportamiento de variables en funciones JSLEl problema si lo hace con globales o espacios de nombres globales es la reutilización (que puede que no le importe).
si ejecuta myFun dos veces con dos botones diferentes (digamos que desea poder aislar su ventana y ejecutar dos instancias).Tendrá colisión y la segunda llamada anulará las primeras.
Vea abajo.
names default to here(1);
new namespace("test");
test:myFun = Function({A1, Z1},{Default Local},
test:A = A1;
test:Z = Z1;
test:A[2] = 10;
test:B = 2*test:A;
show(test:A);
show(test:B);
show(test:Z);
//::g_b = b;
//::g_z = z;
test:nw = new window("test",
vlistbox(
textbox(test:Z),
textbox(char(test:B)),
buttonbox("Show array B (works)",
show(test:B)
),
buttonbox("Show string Z (works)",
show(test:Z)
),
buttonbox("show and close (works)",
show(test:Z, test:B); test:nw << closewindow())
)
)
);
x = [2,3];
y ="string";
test:myFun(x,y);
test:myFun([12, 14], "something else");
si está usando un espacio de nombres, le recomiendo usar el espacio de nombres de la ventana. Se elimina automáticamente cuando la ventana desaparece y no habrá colisión entre dos ventanas idénticas.
names default to here(1);
myFun = Function({A1, Z1},{DEFAULT LOCAL},
A = A1;
Z = Z1;
A[2] = 10;
B = 2*A;
show(A);
show(B);
show(Z);
//::g_b = b;
//::g_z = z;
nw = new window("test",
window:B = B; //uses the builtin window namespace
window:Z = Z; //works because this is a glue statement that returns the last thing
window:box = vlistbox( //which in this case is the vlistbox
textbox(window:Z),
textbox(char(window:B)),
buttonbox("Show array B (works)",
show(window:B)
),
buttonbox("Show string Z (works)",
show(window:Z)
),
buttonbox("show and close (works)",
show(window:Z, window:B); window:box << closewindow())
)
);
);
x = [2,3];
y ="string";
myFun(x,y);
myFun([12, 14], "something else");Re: Comportamiento de variables en funciones JSLGracias Vince. No había pensado en eval(substitute(expr())). Para algunos de mis guiones más complejos, creo que podría ser demasiado difícil hacer un seguimiento de qué se estaba sustituyendo y dónde. Mi código no está exactamente bien organizado y la depuración sería difícil.Re: Comportamiento de variables en funciones JSLGracias, tu idea global me dio otra idea.No me importa tanto el hecho de que las variables sean globales, pero si es necesario que sean globales, prefiero incluirlas en un espacio de nombres contenido.
No creo que el comando clear globals() me muerda aquí, pero me atrapó con mis funciones de recuperación (mis variables de recuperación global fueron borradas por otro script usando clear globals()).Le envié un correo electrónico a JMP y me sugirieron dos alternativas: proteger las variables globales bloqueándolas o colocándolas en su propio espacio de nombres. El espacio de nombres era en realidad más sencillo en términos de robustez.
De todos modos, el código actualizado a continuación parece funcionar bien. La desventaja es escribir "prueba:" adicional cada vez que hago referencia a una variable. Me doy cuenta de que es posible que no lo necesite para todos los usos de variables en la secuencia de comandos, pero por otro lado, probablemente sea una buena práctica y, dado que este uso particular es un espacio de nombres global, puedo ver el contenido de las variables al pasar el cursor sobre los nombres de las variables.
Tenga en cuenta el uso de A1 y Z1. No me dejaba asignar a test:A y test:Z.
Error: el argumento debe ser una lista en el acceso o evaluación de 'Función', Función/*###*/({prueba:A, prueba:Z}, .....
Veré si puedo hacer que esto funcione con varios archivos.
new namespace("test");
test:myFun = Function({A1, Z1},{Default Local},
test:A = A1;
test:Z = Z1;
test:A[2] = 10;
test:B = 2*test:A;
show(test:A);
show(test:B);
show(test:Z);
//::g_b = b;
//::g_z = z;
test:nw = new window("test",
vlistbox(
textbox(test:Z),
textbox(char(test:B)),
buttonbox("Show array B (works)",
show(test:B)
),
buttonbox("Show string Z (works)",
show(test:Z)
),
buttonbox("show and close (works)",
show(test:Z, test:B); test:nw << closewindow())
)
)
);
test:x = [2,3];
test:y ="string";
test:myFun(x,y);Re: Comportamiento de variables en funciones JSLTuve que recurrir a establecer variables globales para que esto funcionara.Parece que el código del cuadro de diálogo no puede ver las variables correctamente.Esta no es una gran solución porque anula el propósito de tener variables locales dentro de una función.
names default to here(1);
myFun = Function({A, Z},{Default Local},
A[2] = 10;
B = 2*A;
show(A);
show(B);
show(Z);
::g_b = b;
::g_z = z;
::g_nw = new window("test",
vlistbox(
textbox(Z),
textbox(char(B)),
buttonbox("Show array B (works)",
show(::g_B)
),
buttonbox("Show string Z (does not work)",
show(::g_Z)
),
buttonbox("show and close (does not work)",
show(::g_Z, ::g_B); ::g_nw << closewindow())
)
)
);
x = [2,3];
y ="string";
myFun(x,y);Re: Comportamiento de variables en funciones JSLB ni siquiera funcionó para mí.
Normalmente, así es como hago cosas de GUI.Es demasiado complicado para el ejemplo que diste, pero creo que muestra un par de métodos diferentes.
names default to here(1);
myFun = Function({A, Z},{Default Local},
A[2] = 10;
B = 2*A;
Eval(
Substitute(
Expr(
nw = new window("test",
vlistbox(
textbox(char(DV_Z)),
textbox(char(DV_B)),
buttonbox("Show array B (works)",
show([]||DV_B); //otherwise you run into an invalid matrix token
),
buttonbox("Show string Z (does not work)",
//show([]||DV_Z); //shouldn't work, you can't make a string a matrix
show(DV_Z);
//or
show(list(DV_Z));
),
buttonbox("show and close (does not work)",
<<SET function=""></SET>Comportamiento de variables en funciones JSL
Mis scripts generalmente tienen dos componentes principales: una función principal seguida del código GUI, todo en el mismo archivo. Por lo general, uso variables que están contenidas en el espacio de nombres Aquí, obtengo las variables de la entrada del usuario y llamo a la función principal desde un cuadro de botón 'Aceptar'. No paso ninguna variable a la función principal, y solo uso las variables que se asignaron en el script del cuadro del botón 'Aceptar'. Estoy considerando cambiar al menos uno de mis scripts para que haya un archivo con la GUI y un segundo archivo con la función principal. Antes de hacerlo, estoy comprobando cómo funciona dentro de un archivo JSL. A continuación se muestra un ejemplo simplificado, sin pasar por la GUI y simplemente definiendo variables después de definir la función pero antes de llamarla.
Una cosa que noté es que es más difícil depurar después de ejecutar un script, porque cuando paso el mouse sobre la xey puedo ver el contenido en la barra de estado en la parte inferior de la ventana. Pero esto no es así para las variables locales A, B, Z y nw. Me pregunto si alguien tiene algún consejo sobre esto.
Tampoco estoy seguro de cómo acceder a los contenidos variables desde el script del cuadro de botones. Si ejecuta el código a continuación, puede ver que A, B, Z aparecen en el registro como se esperaba (justo antes de que se cree la nueva ventana), y B y Z también aparecen en los cuadros de texto de la nueva ventana, pero el botón box script no puede acceder a estas variables directamente. Pude usar eval(parse(eval insert())) para obtener la matriz B pero no pude obtener la cadena Z.¿Hay métodos más directos para hacer que esto funcione?
names default to here(1);
myFun = Function({A, Z},{Default Local},
A[2] = 10;
B = 2*A;
show (A);
show(B);
show(Z);
nw = new window("test",
vlistbox(
textbox(Z),
textbox(char(B)),
buttonbox("Show array B (works)",
show(parse(Eval(Parse(Eval Insert(
"\[^"char(B)"^]\"
)))))
),
buttonbox("Show string Z (does not work)",
show(Eval(Parse(Eval Insert(
"\[^"char(Z)"^]\"
))))
),
buttonbox("show and close (does not work)", show(Z, B); nw << closewindow())
)
)
);
x = [2,3];
y="string";
myFun(x,y);
Gracias,
Miguel
Automatización y secuencias de comandosIngeniería de Calidad y Procesos