Ci sono già diversi thread su questo argomento, oltre a una sezione nella Guida allo scripting, ma nessuno risponde davvero alla mia domanda.
Ho due file, Main.jsl e Function.jsl, e includo quest'ultimo file nel primo. C'è una funzione definita in Function.jsl che desidero chiamare all'interno di un ciclo For in Main.jsl. Il problema che ho riscontrato è che la funzione chiamata utilizza anche un ciclo For e sia i cicli For in Main.jsl che la funzione in Function.jsl usano i come variabile di conteggio, quindi ciò ha provocato l'inquinamento dello spazio dei nomi.
Ho provato un sacco di combinazioni con l'utilizzo di Names Default Here(1) in posizioni diverse in entrambi i file, utilizzando l'argomento << New Context in Include() e persino definendo il nome della funzione come variabile globale usando :: per prova a risolvere questo problema. Tuttavia, il problema era sempre che 1) potevo chiamare la funzione in Function.jsl da Main.jsl, ma ci sarebbe stato un inquinamento dello spazio dei nomi, oppure 2) non sarei stato in grado di chiamare la funzione in Function.jsl da Main.jsl perché la funzione è stata definita in uno spazio dei nomi o in un ambito a cui non sapevo come accedere.
La mia soluzione attuale è definire esplicitamente i e il contenuto dell'intera funzione all'interno di un Local() e definire la funzione stessa come una variabile globale in quanto tale:
Main.jsl
Include("Function.jsl", << New Context);
Names Default To Here(1);
for(i = 1, i <= 10, i++,
returns = ::function(arguments);
);Funzione.jsl
::function = Function({arguments},
Local({i},
for(i = 1, i <= 20, i++,
Do Something;
);<BR /> Return(returns);
);
);La mia domanda è: è davvero questo il modo corretto di procedere? Ad esempio, penso che sarebbe meglio se potessi assegnare uno spazio dei nomi a Function.jsl e quindi usarlo per chiamare la funzione invece di fare confusione con le variabili globali, come return = ns_function:function(arguments);. E idealmente questo preverrebbe anche l'inquinamento dello spazio dei nomi perché la i in Main.jsl si trova nello spazio dei nomi Here, mentre la i in Function.jsl è nello spazio dei nomi ns_function. Ma non so come/se questo sia possibile.
Utilizzo di JMP Pro 16.2 (570548) su Windows 10 Enterprise a 64 bit.