Valores registrados Imprimir valores no coincidentes en ejecuciones de scriptsHola, estoy tratando de entender algún comportamiento en una función que usa el alcance local predeterminado. Es decir, los valores que aparecen en mis registros cuando uso declaraciones de impresión no coinciden con los valores con los que se ejecuta mi código. Por ejemplo en este script:
Names Default To Here( 1 );
EXAMPLE_VALUE = "100";
showExampleModal = Function( {},
{Default Local},
Print("Here:EXAMPLE_VALUE: " || Char(Here:EXAMPLE_VALUE));
Print("EXAMPLE_VALUE: " || Char(EXAMPLE_VALUE));
modal = New Window( "Example Modal",
<<MODAL></MODAL>En mis registros veo:
"Here:EXAMPLE_VALUE: 100"
"EXAMPLE_VALUE: 100"
Sin embargo, en mi modal veo:
Here:EXAMPLE_VALUE: 100
EXAMPLE_VALUE: .
secuencias de comandosRe: Los valores registrados Imprimir no coinciden con los valores en las ejecuciones de secuencias de comandos@mat-esquí , al declarar el espacio de nombres local predeterminado en una función, todas las variables sin ámbito son locales para esa función (consulte aquí ). EXAMPLE_VALUE se declara fuera de la función, por lo que el modal muestra el valor correcto solo cuando la referencia de la variable está en el ámbito Aquí. Declarar EXAMPLE_VALUE dentro de la función lo hará local y disponible para la función, pero entonces no existiría en el espacio de nombres Here para que sea accesible para el resto del script. Aquí está un página útil sobre la referencia de espacio de nombres .
Re: Los valores registrados Imprimir no coinciden con los valores en las ejecuciones de secuencias de comandosDe acuerdo con la documentación que vinculó en la referencia del espacio de nombres, establece que para las funciones definidas por el usuario con Default Local " la regla de referencia no cambia" y la regla de referencia para referencias no calificadas establece:
Si el Nombres predeterminados hasta aquí está activado, JMP busca la variable en estas ubicaciones:
- Local espacio de nombres
- Aquí espacio de nombres
- tabla de datos actual
Por lo tanto, parece que la documentación indica que aún debe recurrir a Here en caso de que no haya una variable local con el nombre en cuestión en el espacio de nombres Local.
Por separado, me parece problemático que el comportamiento de la instrucción Print no coincida con el comportamiento del contexto desde el que se realiza Print.
Re: Los valores registrados Imprimir no coinciden con los valores en las ejecuciones de secuencias de comandosCuando se trata de ámbitos en JSL. Casi siempre digo que sea explícito si se está moviendo entre ellos.Pasé DÍAS tratando de depurar un solo problema de alcance.
Re: Los valores registrados Imprimir no coinciden con los valores en las ejecuciones de secuencias de comandosBasado en una depuración adicional, creo que entiendo lo que está sucediendo.
Código actualizado:
Names Default To Here( 1 );
EXAMPLE_VALUE = "100";
showExampleModal = Function( {},
{Default Local},
// (1)
hereStr = "Here:EXAMPLE_VALUE: " || Char( Here:EXAMPLE_VALUE );
unqualifiedStr = "EXAMPLE_VALUE: " || Char( EXAMPLE_VALUE );
// (2)
hereStrTextBox = Text Box( "Here:EXAMPLE_VALUE: " || Char( Here:EXAMPLE_VALUE ) );
unqualifiedStrTextBox = Text Box( "EXAMPLE_VALUE: " || Char( EXAMPLE_VALUE ) );
// (3)
Print( hereStr );
Print( unqualifiedStr );
modal = New Window( "Example Modal",
<<MODAL></MODAL>
En (1) las asignaciones se evalúan de inmediato y, por lo tanto, cuando se pasan más tarde al Cuadro de impresión/texto, se definen como espero. Esto se confirma con la salida de (3) y la primera en Text Boxes de (4).
En (2) los cuadros de texto se evalúan nuevamente en el momento en que se ejecuta la línea y, por lo tanto, cuando se muestran, se definen nuevamente utilizando los valores que espero. Esto se confirma con los dos últimos cuadros de texto de (4)
De hecho, los dos cuadros de texto del medio de (4) no se evalúan inmediatamente, sino que se pasan al cuadro central (¿o tal vez al cuadro de lista?) como expresiones, y se evalúan más tarde/en otro ámbito (supongo que el ámbito del cuadro de lista o la caja central). Como resultado, el valor de EXAMPLE_VALUE no es lo que esperaba, sino que es el valor de EXAMPLE_VALUE en cualquier otro ámbito en el que se evalúe (es decir, no está definido).
Esto parece ser confirmado por (5), que también pasa las impresiones como expresiones para ser evaluadas más tarde/en otro ámbito.
¿Es esto exacto?
Re: Los valores registrados Imprimir no coinciden con los valores en las ejecuciones de secuencias de comandosLas cajas tienen su propio alcance. actualmente está haciendo una ventana modal, pero imagínese si no lo estuviera y la función se cerrara y todas las variables locales desaparecieran.Para cosas como esa, suelo hacer algo como.
Names default to here(1);
test = function({something_passed, kwargs={}},
{DEFAULT LOCAL},
// Kwargs
kwarg = Try(kwargs["kwarg"], "default"); // kwarg description
something_not_passed = 14;
nw = new window("Scope",
window:something_not_passed = something_not_passed; // just assignthe variable to the display
window:something_passed = something_passed;
window:something_direct = 42;
buttonbox("OK",
<<SET function=""></SET>