JMP utilise l'espace de noms global comme espace de noms par défaut pour tout nouveau script, la façon de spécifier un espace de noms "local" est la commande Noms par défaut ici(1). Ma question est la suivante, lorsque j'inclus un fichier qui a les noms par défaut ici (1) en haut, il apportera les noms/variables du script enfant. Cependant, si je définis
include("filepath/name.ext", << New Context, << NamesDefaultToHere) il gardera les espaces de noms séparés. Quel est le raisonnement derrière cela ? Il semble qu'il devrait faire la même chose? Étant donné que j'utilise une instruction Include, suppose-t-elle que je souhaite absorber les noms du script enfant ?
L'ensemble ci-dessous renvoie x = 10, même si NamesDefaultToHere(1) est dans le script B
Scénario A
x = 5;
include("filepath/script_B.jsl");
show(x);Scénario B
namesDefaultToHere(1);
x = 10;
Alors que celui-ci renvoie x = 5, car j'avais les nomsDefaultToHere dans l'instruction d'inclusion
Scénario A
x = 5;
include("filepath/script_B.jsl", << newContext, <<NAMESDEFAULTTOHERE></NAMESDEFAULTTOHERE>Scénario B
namesDefaultToHere(1);
x = 10
@drewfoglia et @EvanMcCorkle a fait une excellente présentation au Discovery Summit à Tuscon 2019 intitulée Scripts essentiels pour l'efficacité et la reproductibilité : faire moins pour faire plus (2019-US-TUT-290) qui aborde ce sujet.
L'une des diapositives (22) fournit des idées fausses sur les noms par défaut vers ici, dont l'une est que chaque fichier JSL a son propre contexte ici. Cela est vrai si chaque script est exécuté séparément, mais lors de l'inclusion du fichier JSL B dans le fichier JSL A, B partage le contexte Here de A.
Dans le premier exemple, en utilisant les règles de résolution des noms , JMP trouve X dans l'espace de noms Here et affiche la valeur 10.
Dans le deuxième exemple, l'utilisation de "nouveau contexte" crée un espace de noms anonyme dans lequel le script B est exécuté. Dans ce cas, X ne fait pas partie de l'espace de noms Here, la valeur trouvée dans l'espace de noms Global est donc affichée.