On 8/5/05, Ingo Blechschmidt <[EMAIL PROTECTED]> wrote:
> Hi,
> 
>     my $str   = "Hello";
>     $str.ref  = Int;              # allowed?
>     $str.meta = &some_sub.meta;   # allowed?

I hardly think those work.  Both of those require a change of
implementation, which we can't do generically.  So people would have
to specify how the implementation changes in that way, which they
generally won't/can't.  You can do the first using user-defined
methods like so:

    $str = $str as Int        # $str as= Int ?

I'm not sure about the latter.

>     my $str   = "Hello";
>     Str     ::= Int;              # allowed?
>     ::Str   ::= ::Int;            # or is this allowed?

One of these two is probably allowed.  But maybe it should be louder.

>     say $str;                     # still "Hello"? Or is it an Int now?

That's a hard question.  If say is implemented like so (this is
hypothetical; it will surely be implemented in terms of print):

    multi say () { internal_put_str "\n" }
    multi say (*$first, [EMAIL PROTECTED]) {
        given $first {
            when Str { internal_put_str $first }
            when Int { internal_put_int $first }
            ...
        }
        say @stuff;
    }

Then the first case becomes equivalent to "when Int", which would call
internal_put_str with an Int, which could be very dangerous.  This is
why rebinding names globally is a bad idea.  And in that case, I don't
know how or whether we should provide the ability.

Globally subclassing, however, isn't so dangerous:

    Str does role {
        method blah () {...}
    };

But then comes to your question:

    my $foo = "hello";
    Str does role {
        method blah () {...}
    };
    $foo.blah;   # allowed

That is, do existing Strs all "does" the new role as well?

Luke

Reply via email to