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.