Ya hay varios hilos sobre este tema, así como una sección en la Guía de secuencias de comandos, pero ninguno responde realmente a mi pregunta.
Tengo dos archivos, Main.jsl y Function.jsl, e incluyo el último archivo en el primero. Hay una función definida en Function.jsl que deseo llamar dentro de un bucle For en Main.jsl. El problema que tuve es que la Función llamada también usa un bucle For, y tanto los bucles For en Main.jsl como la Función en Function.jsl usan i como una variable de conteo, por lo tanto, esto resultó en una contaminación del espacio de nombres.
Probé un montón de combinaciones con el uso de Nombres predeterminados aquí (1) en diferentes ubicaciones en cualquiera de los archivos, usando el argumento << Nuevo contexto en Incluir(), e incluso definiendo el nombre de la función como una variable global usando :: para tratar de resolver este problema. Sin embargo, el problema siempre fue que 1) podía llamar a la función en Function.jsl desde Main.jsl, pero habría contaminación del espacio de nombres, o 2) no podía llamar a la función en Function.jsl desde Main.jsl porque la Función se definió en un espacio de nombres o ámbito al que no sabía cómo acceder.
Mi solución actual es definir explícitamente i y el contenido de toda la Función dentro de un Local(), y definir la Función en sí misma como una variable global como tal:
Principal.jsl
Include("Function.jsl", << New Context);
Names Default To Here(1);
for(i = 1, i <= 10, i++,
returns = ::function(arguments);
);Función.jsl
::function = Function({arguments},
Local({i},
for(i = 1, i <= 20, i++,
Do Something;
);<BR /> Return(returns);
);
);Mi pregunta es: ¿Es esta realmente la forma correcta de hacerlo? Por ejemplo, creo que sería mejor si pudiera asignar un espacio de nombres a Function.jsl y luego usarlo para llamar a la función en lugar de jugar con variables globales, como return = ns_function:function(arguments);. E idealmente, esto también evitaría la contaminación del espacio de nombres porque la i en Main.jsl está en el espacio de nombres Here, mientras que la i en Function.jsl está en el espacio de nombres ns_function. Pero no sé cómo/si esto es posible.
Uso de JMP Pro 16.2 (570548) en Windows 10 Enterprise de 64 bits.
¡Gracias! Con el indicador {Local predeterminado}, esto funciona exactamente como yo quería.
En este caso, también podría funcionar ({argumentos}, {Local predeterminado} ) para declarar que todas las variables sin ámbito utilizadas en la función son locales para la función (esto es lo que hago el 99% del tiempo).
//main.jsl
Names Default To Here(1);
Include("test.jsl");
For(i = 1, i <= 5, i++,
testparam = i;
return = test();
show(i);
show(return);
);
//test.jsl
Names Default To Here(1);
test = function({}, {Default Local},
For(i = 1, i <= 20, i++,
show(i);
);
show(testparam);
return("done");
)
Función({argumentos}, <{variables locales}>, )>, script)