Je suis sûr que cela a déjà été posté quelque part, mais je n'ai pas réussi à le trouver.
Je ne comprends pas comment la portée des variables est gérée dans JSL.Quelqu'un pourrait-il aider à clarifier comment cela fonctionne.
J'utilise presque toujours i comme variable d'indexation pour les boucles.Par exemple, dans mon script, j'aurai une boucle for avec i comme index qui appelle une autre fonction.Dans cette fonction, il existe une autre boucle for avec i comme index.Cela n'a jamais été un problème en C/Java/etc.Il semble que parfois cela fonctionne en jsl et d'autres fois non.Je n'ai pas d'exemple car je n'ai pas pu comprendre exactement où le problème se produit.Je pense que c'est une compréhension de base de la portée des variables dans JSL.
En JSL, une variable, utilisons votre exemple de variable appelée "i" est décrite comme
espace de noms : je
Si rien n'est spécifié pour définir un espace de noms, la spécification formelle est :
::je
Étant donné que l'espace de noms par défaut dans JSL est un espace de noms nommé ":"...... assez bizarre, mais il y a des raisons historiques à cela.Donc si vous entrez
je = 7 ;
Ce que JMP voit est :
::je = 7;
Ainsi, maintenant, si dans n'importe quelle partie d'un script JSL, la variable i est modifiée, puis référencée plus tard, elle aura la nouvelle valeur
showit = Function( {I},
Show(I);
);
I = 2;
showit(I);
I=3;
showit(I);
ça revient
I = 2;
I = 3;
Désormais, une fonction peut isoler une variable en rendant la variable locale à la fonction.
showit = Function( {I},{I},
I=55;
Show(I);
);
I = 2;
showit(I);
show(i);
Le résultat de ce code est :
I = 55;
i = 2;
remarquez que la valeur de i pour son utilisation globale n’a pas changé.
Maintenant, une dernière confusion :
Quand j'ai dit que la valeur de i peut être modifiée et que toutes les utilisations ultérieures de i refléteront ce changement, cela signifie qu'elle sera modifiée même dans les différents scripts en cours d'exécution.Ainsi, si un nouveau script est exécuté et contient la variable i, il aura la valeur du i définie dans le script JSL précédent.Ainsi, l'instruction "Names Default to Here( 1 );" a été mis en œuvre.Cette déclaration fait 2 choses.Tout d’abord, il modifie l’espace de noms de : : à « Ici ».Deuxièmement, il isole toutes les variables de l'espace de noms « Ici » uniquement pour les variables du script en cours d'exécution.Alors maintenant, si vous avez le script suivant
Names Default to Here( 1 );
i = 7;
cette instance de la variable i ne sera modifiée que par l'utilisation de i dans le script.....aucun autre script n'aura accès à la modification de cette variable i.
PS La description formelle de la variable i est :
ici je
et toute variable du script créée dans le script, après "Names Default to Here( 1 );" L'instruction sera automatiquement placée dans l'espace de noms appelé Here.
Names Default to Here( 1 );
i = 7;
show(here:i)
Je ne peux pas utiliser le « ici : » pour adresser explicitement les variables dans leur espace de noms ici ?
Pourquoi les adresses des colonnes sont-elles par exemple « :sex ».
Un espace de noms vide signifie : « table de données actuelle() » ?