Values logged in Print not matching values in script executionsHi, I am trying to understand some behavior in a function that uses Default Local scope. Namely, the values that appear in my logs when using Print statements do not match the values that my code is executed with. For example in this 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>In my logs I see:
"Here:EXAMPLE_VALUE: 100"
"EXAMPLE_VALUE: 100"
However in my modal I see:
Here:EXAMPLE_VALUE: 100
EXAMPLE_VALUE: .
ScriptingRe: Values logged in Print not matching values in script executions@mat-ski, when declaring the Default Local namespace in a function, all unscoped variables are local to that function (see here). EXAMPLE_VALUE is declared outside the function, so the modal displays the correct value only when the variable reference is scoped to Here. Declaring EXAMPLE_VALUE inside the function will make it local and available to the function, but it then wouldn't exist in the Here namespace to be accessible to the rest of the script. Here's a helpful page on namespace referencing.
Re: Values logged in Print not matching values in script executionsAccording to the documentation that you linked on namespace referencing it states that for user defined functions with Default Local "reference rule is unchanged" and the reference rule for unqualified references states:
If the Names Default To Here mode is on, JMP looks for the variable in these locations:
- Local namespace
- Here namespace
- current data table
So it seems like the documentation is stating that it should still fallback to Here in case there is no local variable with the name in question in the Local namespace.
Separately, it seems problematic to me that the behavior of the Print statement does not match the behavior of the context from which the Print is being made.
Re: Values logged in Print not matching values in script executionsWhen dealing with scopes in JSL. I pretty much always say just be explicit if you're moving about between them. I've spent DAYS trying to debug a single scoping issue.
Re: Values logged in Print not matching values in script executionsBased on some further debugging I believe that I understand what is happening.
Updated code:
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>
At (1) the assigments are evaluated right away and so when they are passed later to the Print/Text Box they are defined as I expect. This is confirmed by the output of (3) and the first to Text Boxes of (4).
At (2) the Text Boxes are again evaluated at the time the line is executed, and so when they are displayed, they are again defined using the values that I expect. This is confirmed by the last two Text Boxes of (4)
The middle two Text Boxes of (4) are not in fact evaluated immediately, but passed to the Center Box (or maybe the List Box?) as expressions, and evaluated later/in another scope (I guess the scope of either the List Box or the Center Box). As a result the value of EXAMPLE_VALUE is not what I expected, instead it is the value of EXAMPLE_VALUE in whatever other scope it is being evaluated in (namely it is undefined).
This seems to be confirmed by (5), which also passes the Prints as expressions to be evaluated later / in another scope.
Is this accurate?
Re: Values logged in Print not matching values in script executionsboxes have their own scope. currently you're doing a modal window but imagine if you weren't and the function closed and all the local variables are now gone. For stuff like that I usually do something like.
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>