Valeurs enregistrées Impression ne correspondant pas aux valeurs dans les exécutions de scriptBonjour, j'essaie de comprendre certains comportements dans une fonction qui utilise la portée locale par défaut. À savoir, les valeurs qui apparaissent dans mes journaux lors de l'utilisation des instructions Print ne correspondent pas aux valeurs avec lesquelles mon code est exécuté. Par exemple dans ce script :
Names Default To Here( 1 );
EXAMPLE_VALUE = "100";
showExampleModal = Function( {},
{Default Local},
Print("Here:EXAMPLE_VALUE: " || Char(Here:EXAMPLE_VALUE));
Print("EXAMPLE_VALUE: " || Char(EXAMPLE_VALUE));
modal = New Window( "Example Modal",
<<MODAL></MODAL>Dans mes logs je vois :
"Here:EXAMPLE_VALUE: 100"
"EXAMPLE_VALUE: 100"
Cependant, dans mon modal, je vois:
Here:EXAMPLE_VALUE: 100
EXAMPLE_VALUE: .
ScriptRe : Les valeurs enregistrées dans l'impression ne correspondent pas aux valeurs dans les exécutions de script@mat-ski , lors de la déclaration de l'espace de noms Default Local dans une fonction, toutes les variables non délimitées sont locales à cette fonction (voir ici ). EXAMPLE_VALUE est déclaré en dehors de la fonction, de sorte que le modal affiche la valeur correcte uniquement lorsque la référence de variable est limitée à Here. Déclarer EXAMPLE_VALUE à l'intérieur de la fonction le rendra local et disponible pour la fonction, mais il n'existerait alors pas dans l'espace de noms Here pour être accessible au reste du script. Voici un page utile sur le référencement des espaces de noms .
Re : Les valeurs enregistrées dans l'impression ne correspondent pas aux valeurs dans les exécutions de scriptSelon la documentation que vous avez liée sur l'espace de noms faisant référence, il indique que pour les fonctions définies par l'utilisateur avec Default Local " la règle de référence est inchangée" et la règle de référence pour les références non qualifiées indique :
Si la Noms par défaut ici est activé, JMP recherche la variable aux emplacements suivants :
- Local espace de noms
- Ici espace de noms
- tableau de données actuel
Il semble donc que la documentation indique qu'elle devrait toujours revenir à Here au cas où il n'y aurait pas de variable locale avec le nom en question dans l'espace de noms Local.
Séparément, il me semble problématique que le comportement de l'instruction Print ne corresponde pas au comportement du contexte à partir duquel l'impression est réalisée.
Re : Les valeurs enregistrées dans l'impression ne correspondent pas aux valeurs dans les exécutions de scriptLorsqu'il s'agit de portées dans JSL. Je dis presque toujours qu'il suffit d'être explicite si vous vous déplacez entre eux.J'ai passé des JOURS à essayer de déboguer un seul problème de portée.
Re : Les valeurs enregistrées dans l'impression ne correspondent pas aux valeurs dans les exécutions de scriptSur la base d'un débogage supplémentaire, je crois que je comprends ce qui se passe.
Code mis à jour :
Names Default To Here( 1 );
EXAMPLE_VALUE = "100";
showExampleModal = Function( {},
{Default Local},
// (1)
hereStr = "Here:EXAMPLE_VALUE: " || Char( Here:EXAMPLE_VALUE );
unqualifiedStr = "EXAMPLE_VALUE: " || Char( EXAMPLE_VALUE );
// (2)
hereStrTextBox = Text Box( "Here:EXAMPLE_VALUE: " || Char( Here:EXAMPLE_VALUE ) );
unqualifiedStrTextBox = Text Box( "EXAMPLE_VALUE: " || Char( EXAMPLE_VALUE ) );
// (3)
Print( hereStr );
Print( unqualifiedStr );
modal = New Window( "Example Modal",
<<MODAL></MODAL>
En (1), les affectations sont évaluées immédiatement et, par conséquent, lorsqu'elles sont transmises ultérieurement à la zone d'impression/de texte, elles sont définies comme prévu. Ceci est confirmé par la sortie de (3) et la première des zones de texte de (4).
En (2), les zones de texte sont à nouveau évaluées au moment où la ligne est exécutée, et donc lorsqu'elles sont affichées, elles sont à nouveau définies en utilisant les valeurs que j'attends. Ceci est confirmé par les deux dernières zones de texte de (4)
Les deux zones de texte du milieu de (4) ne sont en fait pas évaluées immédiatement, mais transmises à la zone centrale (ou peut-être à la zone de liste ?) en tant qu'expressions, et évaluées ultérieurement/dans une autre portée (je suppose que la portée de la zone de liste ou la boîte centrale). En conséquence, la valeur de EXAMPLE_VALUE n'est pas ce à quoi je m'attendais, c'est plutôt la valeur de EXAMPLE_VALUE dans n'importe quelle autre portée dans laquelle elle est évaluée (c'est-à-dire qu'elle n'est pas définie).
Ceci semble être confirmé par (5), qui passe également les Prints comme des expressions à évaluer ultérieurement / dans un autre domaine.
Est-ce exact?
Re : Les valeurs enregistrées dans l'impression ne correspondent pas aux valeurs dans les exécutions de scriptles boîtes ont leur propre portée. actuellement vous faites une fenêtre modale mais imaginez si vous ne l'étiez pas et que la fonction se ferme et que toutes les variables locales ont maintenant disparu.Pour des trucs comme ça, je fais habituellement quelque chose comme.
Names default to here(1);
test = function({something_passed, kwargs={}},
{DEFAULT LOCAL},
// Kwargs
kwarg = Try(kwargs["kwarg"], "default"); // kwarg description
something_not_passed = 14;
nw = new window("Scope",
window:something_not_passed = something_not_passed; // just assignthe variable to the display
window:something_passed = something_passed;
window:something_direct = 42;
buttonbox("OK",
<<SET function=""></SET>