TSa (Thomas Sandlaß)
Wed, 20 Jul 2005 10:05:10 -0700
Matthew Hodgson wrote:
On Tue, 19 Jul 2005, Larry Wall wrote:The * looks like a twigil but it isn't really. It's short for "*::",
Is *:: going up to the outermost Perl6 bubble or to the interpreter that handles it? I mean where do gateways to other languages show up: parallel to *::Perl6 like *::Python, *::Ruby or one below that? Actually both might make sense. The pure *::Language goes for Parrot level barebone inter language while *::Perl6::Language goes through Perl6 wrappers/adapters. Or would the differentiation between $*Foo # $*::Perl6::Foo and $*::Foo # start at interpreter level be too subtle? Hmm, it might be needed to disambiguate *foo which could mean 'call outermost foo' or 'call innermost foo and cast return value to list'. Well, or the prefix ops * and ** need whitespace then: * *foo; ** *foo;
where the * is a wildcard package name, so in theory we could have $=*foo, meaning the $=foo in the *:: package. (But most of the twigils imply a scope that is immiscible with package scope.)
I still consider sigils/twigils as minimum type mark-up---or make-up :)
I'm very surprised that package variables end up in OUR::, however - because surely they're not necessarily lexically scoped - and the whole point of 'our' was lexical global scoping, right? :/
Sorry, what is 'lexical global scoping' e.g. compared to non-global lexical scoping? Is it not so, that conceptually a program that is loaded from several files can be seen as a complete nesting of all used packages, modules, classes etc. where the file scopes are replaced by pairs of braces? The care takers of OUR:: are the package, module, class and role meta classes while MY:: is handled by everything in braces basically. This at least is how I think of lexical scoping. Correct me if I'm wrong, please!
I've tried to wrap my head around all these behaviours of :: and summarize them here for future readers: inevitable corrections more than welcome ;)::Foo # leading sigil: disambiguates Foo as being in type space $Foo::bar # trailing sigil: indicates preceding term is in type space
> $Foo::Baz::bar # separator: type space hierarchy separator
::($foo) # special case leading form which behaves more like the
# trailing sigil & separator form for building up type
# terms from expressions, as ($foo):: would be ambiguous.
Isn't it easier to say that :: is a unary/binary, right associative
pseudo operator with the following properties:
1) whitespace around :: is not allowed
-> whitespace to the left stops outwards scanning
-> this allows ?? ::
2) its rhs is the leaf name you want to refer to
3) the lhs is the namespace path to that leaf
4) a * wildcard starts lookup from the root
(for details of *Foo versus *::Foo see above)
5) parentheses cause symbolic runtime lookup, otherwise
the lookup is at compile time and needs pre-declared
names because there are no barewords
6) a sigil determines the type you want to refer to:
-> no sigil means autoderefed---that is called---Code
-> whitespace means a type (if more than one leaf
matches because the name is overloaded the least
upper bound (lub = any type junction) supertype is
returned.
Question: how are sigil and name lookup prioritized? I mean
does a matching sigil type further outwards, and
when a path is used from there inwards, overwrite
a closer type mismatch? My guess is: 'sigil rules'.
Question: does .::Foo::bar parse and does that also work
for private data access in class scope like .:::Foo::bar
or .::Foo:::bar? In the first case :Foo is a trusting
private sibbling whose .bar method shall be called.
In the second example the private method .:bar from the
one-outwards scope Foo shall be called.
I assume that I am correctly following your lead in referring to package/module/class namespaces as 'type space' here...
Hmm, if that is the name for nameespace now, so be it. But to me it is still the plain old strictly tree-structured name space lookup. The point is that what you---or actually the compiler--- get from there is *type* information!
As regards $::foo, making a special case for it being a synonym for $*Main::foo be yet another complication entirely without precedent in the current behaviour. But then again, using $::x in the past as a quick way to disambiguate between lexical & package variables in simple package-less scripts was quite handy...
The question that nags me is where autovivified variables go to and when. I think the compiler has the information about all lexicals and could put them in the right place in the name space tree *before* execution. Would that be at CHECK or INIT time? -- TSa (Thomas Sandlaß)