Represents the top of the AST. This is a node not present in MRI. It was created to
hold the top-most static scope in an easy to grab way and it also exists to hold BEGIN
and END nodes. These can then be interpreted/compiled in the same places as the rest
of the code.
Return the dynamic scope for this AST. The variable backed by this is transient so
for serialization this is null. In that case we use staticScope to rebuild the dynamic
scope. The real reason for this method is supporting bindings+eval. We need to pass
our live dynamic scope in so when we eval we can use that dynamic scope.
The static scoping relationships that should get set first thing before interpretation
of the code represented by this AST. Actually, we use getScope first since that also
can contain a live dynamic scope. We rely on this method only for interpreting a root
node from a serialized format.