Hi,
Larry Wall wrote:
> On Sat, Aug 20, 2005 at 10:33:03PM +0000, Ingo Blechschmidt wrote:
> : S02 says:
> : our $a; say $::("a"); # works
> :
> : my $a; say $::("a"); # dies, you should use:
> : my $a; say $::("MY::a"); # works
>
> That looks like somebody's relic of Perl 5 thinking. Personally,
> I don't see why the second one should die. I was kind of hoping
> that symbolic lookups would include lexicals in Perl 6, unlike in
> Perl 5. Then you use MY or OUR to force it one way or the other.
I like that very much! :)
> : How can I use symbolic dereferentiation to get $?SELF, $?CLASS,
> : ::?CLASS, %MY::, etc.?
> :
> : say $::('$?SELF'); # does this work?
>
> Probably not, since the ::() notation doesn't want sigils in the key,
> and you have to say
>
> $?::('SELF')
>
> to have any hope of it working. On the other hand
>
> %MY::<$?SELF>
>
> might get you the symbol out of the symbol table hash,
ok.
> unless $?SELF is too macro-y for that. $? variables aren't required
> to have a dynamically lookupable meaning at run time, since their
> native dynamic context is the compiler, not the run-time.
Makes perfect sense.
>
> : say $::('MY::$?SELF'); # or this?
>
> No, we don't currently allow sigils after ::.
I took that straight from S02 :):
> All symbolic references are done with this notation:
>
> $foo = "Foo";
> $foobar = "Foo::Bar";
> $::($foo) # package-scoped $Foo
> $::("MY::$foo") # lexically-scoped $Foo
> $::("*::$foo") # global $Foo
> $::($foobar) # $Foo::Bar
> $::($foobar)::baz # $Foo::Bar::baz
> $::($foo)::Bar::baz # $Foo::Bar::baz
> $::($foobar)baz # ILLEGAL at compile time (no operator baz)
> and such.) I think I like the option lowering the sigil to the key.
> Maybe the outer sigil is meaningless in that case, and it's just
>
> OUTER::OUTER::<$_>
>
> But if we say that any package/type name can tagmemically function
> as a hash if you use like one, then the last :: can go too:
>
> OUTER::OUTER<$_>
> OUTER::OUTER{'$_'}
I like those, especially as we've said that the sigils are part of the
variable name.
> Though we're getting close to confusing this notation with
>
> %OUTER::OUTER::{'$_'}
>
> which looks similar, but (if we take the Perl 5 meaning) doesn't
> do :: splitting on the key. In other words, this would also get
> to OUTER::OUTER<$_>:
>
> OUTER{'$OUTER::_'}
>
> because it's accessing through the package as a hash and does further
> :: breakdown. But this wouldn't work:
>
> %OUTER::{'$OUTER::_'}
>
> because it's accessing through the actual symbol table hash, which
> doesn't have any such symbol as one of its keys.
>
> That's an awfully subtle distinction, though. I think OUTER::OUTER's
> symbol table hash needs a better name than %OUTER::OUTER. Maybe it's
> named OUTER::OUTER<%OUR> or OUTER::OUTER::<%MY> or some such.
Makes sense.
> Which makes me think that Perl 5's %FOO::{'name'} symbol table
> notation is really bogus, because %OUTER:: doesn't really refer to a
> single symbol table in Perl 6, but the starting place for a symbol
> search that may span several symbol tables.
If we go with these changes, this functionality (starting place for a
search) would be available by using
Foo::Bar<$symbol_to_lookup>; # right?
--Ingo
--
Linux, the choice of a GNU | self-reference, n. - See self-reference
generation on a dual AMD |
Athlon! |