Estoy seguro de que esto ya está publicado en algún lugar, pero no pude encontrarlo.
Estoy confundido sobre cómo se maneja el alcance de las variables en JSL.¿Alguien podría ayudar a aclarar cómo funciona?
Casi siempre uso i como la variable de indexación para bucles.Por ejemplo, en mi script tendré un bucle for con i como índice que llama a otra función.En esta función, hay otro bucle for con i como índice.Esto nunca ha sido un problema en C/Java/etc.Parece que a veces funciona en jsl y otras veces no.No tengo un ejemplo porque no he podido averiguar exactamente dónde ocurre el problema.Sin embargo, creo que es una comprensión básica del alcance de las variables en JSL.
En JSL, una variable, usemos su ejemplo de una variable llamada "i" se describe como
espacio de nombres: yo
Si no se especifica nada para establecer un espacio de nombres, la especificación formal es:
::i
Dado que el espacio de nombres predeterminado en JSL es un espacio de nombres llamado ":"... bastante extraño, pero hay razones históricas para esto.Así que si entras
yo = 7;
Lo que JMP está viendo es:
::i = 7;
Entonces, ahora, si en cualquier parte de un script JSL, la variable i se cambia y luego se hace referencia a ella más adelante, tendrá el nuevo valor
showit = Function( {I},
Show(I);
);
I = 2;
showit(I);
I=3;
showit(I);
vuelve
I = 2;
I = 3;
Ahora, una función puede aislar una variable, haciendo que la variable sea local a la función
showit = Function( {I},{I},
I=55;
Show(I);
);
I = 2;
showit(I);
show(i);
El resultado de este código es:
I = 55;
i = 2;
observe que el valor de i para el uso global de la misma no ha cambiado.
Ahora para una cierta confusión final:
Cuando dije que el valor de i se puede cambiar, y todos los usos posteriores de i reflejarán ese cambio, eso significa que se cambiará incluso en diferentes scripts que se estén ejecutando.Entonces, si se ejecuta un nuevo script que tiene la variable i, tendrá el valor de i que se estableció en el script JSL anterior.Por lo tanto, la instrucción "Nombres predeterminados aquí (1);" Fue implementado.Esta declaración hace 2 cosas.Primero, cambia el espacio de nombres de ":" a "Aquí".En segundo lugar, aísla todas las variables en el espacio de nombres "Aquí" a solo las variables en el script que se está ejecutando.Así que ahora, si tienes el siguiente script
Names Default to Here( 1 );
i = 7;
esta instancia de la variable i solo se cambiará mediante el uso de i dentro del script... ningún otro script tendrá acceso al cambio de esa variable i.
PD La descripción formal de la variable i es:
Aquí yo
y cualquier variable en la secuencia de comandos que se crea en la secuencia de comandos, después de "Nombres predeterminados aquí (1);" La declaración se colocará automáticamente en la llamada de espacio de nombres Here.
Names Default to Here( 1 );
i = 7;
show(here:i)
¿No puedo usar "aquí:" para dirigirme explícitamente a las variables en ese espacio de nombres?
¿Por qué las direcciones de las columnas se obtienen mediante, por ejemplo, " :sexo "?
¿El espacio de nombres vacío significa: " tabla de datos actual() "?