Si je me trompe, corrigez-moi, mais il semblerait que JMP ait une portée dynamique sans persistance de portée (à l'exception des pseudo-espaces de noms Ici , Local , Fenêtre , Boîte ).Cela contraste avec de nombreux langages de programmation populaires qui ont une portée lexicale avec une persistance complète à l'aide de compteurs de références.
Cela m'a causé beaucoup de casse-tête jusqu'à ce que j'acquière l'intuition nécessaire pour travailler avec le système de portée étrange de JMP, et je pense que c'est un grand point de confusion pour beaucoup de gens.Peu de langages de programmation utilisent la portée dynamique (LISP étant une exception importante, et JSL présente certaines similitudes avec LISP).
J'encourage l'équipe de documentation JSL à souligner cette distinction et à fournir des ressources/liens sur la façon de mieux comprendre la portée dynamique car ce n'est certainement pas la manière standard de faire la résolution de noms.
Voici un exemple : la portée locale de la fonction externe est effacée immédiatement après l'instruction de retour, et la résolution de nom des fonctions internes est dynamique (basée sur la pile d'appels actuelle) :
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()
/*:
7Si vous faites quelque chose d'équivalent sur le plan fonctionnel dans un langage à portée lexicale avec persistance de portée (comme Python), alors la portée englobante de la fonction interne est persistante (c'est la portée locale pour la fonction externe), et la résolution de nom pour la fonction interne la variable x de la fonction est la valeur 4 issue de la lecture lexicale du système.Étant donné que JMP n'utilise pas la portée lexicale, mais utilise la portée dynamique, alors lorsque la fonction interne est finalement exécutée à la fin du script, elle utilise la résolution de nom dynamique de Local -> Ici -> Global (et éventuellement la colonne- noms pour la table courante) et trouve la valeur 7.
Comprendre ce type de comportement est essentiel pour créer des programmes robustes en JSL, et je veux juste le signaler à tous ceux qui apprennent / luttent avec JSL.
Faites-moi savoir si vous avez des idées / des exemples non intuitifs !