JMP utilizza lo spazio dei nomi globale come spazio dei nomi predefinito per qualsiasi nuovo script, il modo per specificare uno spazio dei nomi "locale" è il comando Names Default to Here(1). La mia domanda è questa, quando includo un file che ha i nomi predefiniti qui (1) in alto, riporterà i nomi/variabili dallo script figlio. Tuttavia, se definisco
include("filepath/name.ext", << New Context, << NamesDefaultToHere) manterrà gli spazi dei nomi separati .. Qual è il ragionamento alla base di questo? Sembra che dovrebbe fare la stessa cosa? Dato che sto usando un'istruzione Include, presuppone che io voglia assorbire i nomi dallo script figlio?
L'insieme seguente restituisce x = 10, anche se NamesDefaultToHere(1) è nello script B
Sceneggiatura A
x = 5;
include("filepath/script_B.jsl");
show(x);Sceneggiatura B
namesDefaultToHere(1);
x = 10;
Mentre questo restituisce x = 5, perché avevo i nomiDefaultToHere nell'istruzione include
Sceneggiatura A
x = 5;
include("filepath/script_B.jsl", << newContext, <<NAMESDEFAULTTOHERE></NAMESDEFAULTTOHERE>Sceneggiatura B
namesDefaultToHere(1);
x = 10
@drewfoglia E @EvanMcCorkle ha tenuto un'eccellente presentazione al Discovery Summit di Tuscon 2019 dal titolo Scripting essenziale per efficienza e riproducibilità: fare di meno per fare di più (2019-US-TUT-290) che tratta questo argomento.
Una delle diapositive (22) fornisce idee sbagliate sui nomi predefiniti per qui, uno dei quali è che ogni file JSL ha il proprio contesto qui. Questo è vero se ogni script viene eseguito separatamente ma quando si include il file JSL B nel file JSL A, B condivide il contesto Here di A.
Nel primo esempio, usando le regole per la risoluzione dei nomi , JMP trova X nello spazio dei nomi Here e mostra il valore 10.
Nel secondo esempio, uso di "nuovo contesto" sta creando uno spazio dei nomi anonimo in cui viene eseguito lo script B. In questo caso, X non fa parte dello spazio dei nomi Here, quindi viene mostrato il valore trovato nello spazio dei nomi Global.