Declaration Semantics
KRL declarations are not variable assignments. And KRL uses static binding semantics. As a result you may be surprised if you redeclare a specific variable.
For example, consider the following declarations:
pre {
x = 3;
y = function(a){x + a};
z = {"foo": 3}
}Internally, this declaration block produces the following environment:
When we make a function call like y(6), the result will be 9 because x is defined globally, from y's perspective.
Now supposed we have a block that redeclares x to be 5.
pre {
x = 3;
y = function(a){x + a};
z = {"foo": 3}
x = 5;
}The resulting environment looks like this:
Note that the first x is still there. Code referencing x in this environment will start looking for x from the bottom and see 5 since that declaration shadows the first.
But, when we call y(6), the result will still be 9 not 11 because the function sees the environment from it's perspective and so x is still 3.
This is not how a language with assignment would behave. Instead of rebinding x to 5, such a language would update the original x through assignment and when y(6) executes, the result would be 11.
Copyright Picolabs | Licensed under Creative Commons.