Se sbaglio, per favore correggimi, ma sembrerebbe che JMP abbia un ambito dinamico senza persistenza dell'ambito (ad eccezione degli pseudo-spazi dei nomi Qui , Locale , Finestra , Scatola ).Ciò contrasta con molti linguaggi di programmazione popolari che hanno ambito lessicale con persistenza completa dell'ambito utilizzando contatori di riferimento.
Ciò ha causato un sacco di confusione da parte mia fino a quando non ho acquisito l'intuizione necessaria per lavorare con lo strano sistema di ambito che ha JMP, e credo che sia un grande punto di confusione per molte persone.Non molti linguaggi di programmazione usano l'ambito dinamico (LISP è un'eccezione importante e JSL ha alcune somiglianze con LISP).
Incoraggerei il team di documentazione JSL a sottolineare questa distinzione e fornire alcune risorse/collegamenti su come comprendere meglio l'ambito dinamico poiché certamente non è il modo standard di eseguire la risoluzione dei nomi.
Ecco un esempio: l'ambito locale della funzione esterna viene cancellato immediatamente dopo l'istruzione return e la risoluzione dei nomi delle funzioni interne è dinamica (basata sullo stack di chiamate corrente):
Names Default to Here( 1 );
x = 7;
outer function = Function( {},
{x},
x = 4;
inner function = Function( {},
Print( x )
);
Return( Name Expr( inner function ) );
);
func = outer function;
func()
//:*/
Names Default to Here( 1 );
x = 7;
outer function = Function( {},
{x},
x = 4;
inner function = Function( {},
Print( x )
);
Return( Expr( inner function ) );
);
func = outer function;
func()
/*:
7Se fai qualcosa di funzionalmente equivalente in un linguaggio con ambito lessicale con persistenza dell'ambito (come Python), allora l'ambito di inclusione della funzione interna è persistente (è l'ambito locale per la funzione esterna) e la risoluzione del nome per la funzione interna la variabile x della funzione è il valore 4 dalla lettura lessicale del sistema.Poiché JMP non utilizza l'ambito lessicale, ma utilizza l'ambito dinamico, quando la funzione interna viene finalmente eseguita alla fine dello script, utilizza la risoluzione dei nomi dinamica di Local -> Here -> Global (e possibile colonna- nomi per la tabella corrente) e trova il valore 7.
Comprendere questo tipo di comportamento è fondamentale per creare programmi robusti in JSL e voglio solo farlo notare a chiunque stia imparando / lottando con JSL.
Fatemi sapere se avete pensieri/esempi poco intuitivi!