|
Perl 6
SMOP Lexical Scope Implementation: Revision 9
One first hard step in implementing lexical scopes is to put together a lot of details that are spread over the specs. In this page we're going to sketch a model for the lexical scopes that support all the documented Perl 6 features. Variable LookupThe local variable lookup happens in the following order:
Special cases$_$_ is always locally defined in any block. Routines start with an empty $_, other Code objects have a signature of: -> $_ is rw = OUTER::<$_> $! and $/These variables are compile-time aliases to $+! and $+/ ModellingData Structure
class LexicalScope {
has %.entries handles postcircumfix:<{}>;
has LexicalScope $.outer is rw;
}
Accessing the Lexical ScopeThe lexical scope is an attribute of the continuation, meaning that the "current continuation" points to the "current lexical scope". The Perl 6 specs doesn't specify a macro that return the current continuation, so we have one of the SMOP Specific Macros ___CURRENT_CONTINUATION___. This should provide access to the following API:
class Continuation {
has LexicalScope $.lexical is rw;
has Continuation $.caller is rw;
}
This should be part of the SMOP Interpreter Implementation API. Making a variable lookup
class LexicalScope is also {
method lookup($name) {
my $lexical = ___CURRENT_CONTINUATION___.lexical;
if ($lexical.entries.exists($name)) {
return $lexical{$name};
} elsif ($lexical.outer) {
return $lexical.outer;
} else {
fail("No variable $name in the current scope");
}
}
}
|