Esistono già diversi thread su questo argomento, nonché una sezione nella Guida allo scripting, ma nessuno risponde realmente 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 utilizzano i come variabile di conteggio, quindi ciò ha comportato 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 utilizzando :: per cercare di risolvere questo problema. Tuttavia, il problema era sempre che 1) ero in grado di chiamare la funzione in Function.jsl da Main.jsl, ma ci sarebbe stato 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 variabile globale come 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 scherzi con le variabili globali, come return = ns_function:function(arguments);. E idealmente questo impedirebbe anche l'inquinamento dello spazio dei nomi perché i in Main.jsl è nello spazio dei nomi Here, mentre 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.
Grazie! Con il flag {Default Local} funziona esattamente come volevo.
In questo caso potresti anche utilizzare function({arguments}, {Locale predefinito} ) per dichiarare che tutte le variabili senza ambito utilizzate nella funzione sono locali alla funzione (questo è ciò che faccio il 99% delle volte).
//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");
)
Funzione({argomenti}, <{variabili locali}>, )>, script)