On Wed, 20 Jul 2005, "TSa (Thomas Sandlaß)" wrote:
Matthew Hodgson wrote:

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?

Sure - a nesting of namespaces as opposed to lexical pads.

The care takers of OUR:: are the package, module, class and
role meta classes while MY:: is handled by everything in braces
basically.

Well, when I saw the pseudo-namespace OUR::, my first thoughts were that its contents would be the current our()d variables which we can access in a non-qualified manner in our current lexical pad. Not that it was actually all the package variables in our current namespace, be they currently lexically accessible or not. Surely this pseudo-namespace should be called PACKAGENAME:: or something rather than OUR:: in order to avoid this confusion?

Whilst:

% perl -we 'use strict; { our $foo = "foo"; } warn $::foo'

makes sense in perl 5, I still maintain that:

% perl6 -we '{ our $foo = "foo"; } warn $OUR::foo'

is kinda confusing ;)

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.

These rules are all fair enough - but they are then ambiguous for $::Foo. Is that the leaf name variable Foo in your current (innermost) namespace? Or is it an attempt to dereference the disambiguated type Foo? Or is it like perl5, shorthand for $*Main::Foo?

Is there any reason why $::Foo could not do both, and not start by searching your current namespace for a variable called $Foo... and then start searching your current namespace hierarchy for a type called Foo and try to dereference it (whatever that does)?

Presumably it should behave in precisely the same way that $::('Foo') does for sanity - does that search the current namespace for just types or variables or both?

M.

Reply via email to