--- Luke Palmer <[EMAIL PROTECTED]> wrote:
> > Luke Palmer:
> > # Now, I don't know what Larry has up his sleeve in this 
> > # respect, but as I see it now, C<is> is too heavily 
> > # overloaded.  As it stands, it means 3 things:
> > # 
> > #     (1) Attributing traits
> > #     (2) Inheriting base classes
> > #     (3) "Tying" variables
> > # 
> > # Depending on how traits are implemented, (1) and (3) might be 
> > # unified.
> > 
> > Who's to say they aren't all unified?  If a trait is just a sort of
> base
> > class, and an instance of Scalar (the container) is seen as having
> its
> > own (anonymous) class, then all three are one and the same.
> 
> Consider this:
> 
>     my %hash is keyed(Int);
> 

Given that Larry was talking about typing the other day, how about a
"template-style" behavior that would use types and overrides:

class hash {
   has type key is Scalar;         # Declare the types up front
   has type value is Scalar;       # Declare the types up front
   insert(key $k, value $v) {...}
}

my %hash has key(int)
         has value(String);        # Run-time type substitution.

%hash{1} = "Foo";      # okay
%hash{"Foo"} = "Bar";  # Error, or String2int("Foo")

This has the advantage of allowing parameterized types in a standard
way, but the potential disadvantage of increasing compilation time, and
maybe increasing executable size. (I'm not sure on the last one...)




> That would require C<keyed> to implement all hash methods, which I'm
> not sure it wants to do.  Even if it does, how do you make it work
> with base classes like C<constant> which I<also> want to change how
> it's keyed.  For an even clearer example:
> 
>     my %hash is constant;
>     my @array is constant;
>     my $scalar is constant;
> 
> Apparently, these are all implemented with the same container, and
> should behave identically.
> 
> Nope.  Traits aren't ties.
> 
> ----------
> 
>     sub foo() {...}
>     sub bar(&code is rw) {
>         &code = { "Mwahahaha" };
>     }
>     bar(&foo);
> 
> If traits are inheritance, then this code shouldn't compile.  foo()
> is
> not declared rw, so it can't be passed into bar, which is expecting a
> sub that's declared rw.
> 
> Obviously, bar()'s C<is rw> is referring to the container being
> read-write, and not the sub's return value (which C<is rw> would
> specify were it on the definition of sub foo()).
> 
> Nah-uh.  Traits aren't inheritance either.
> 
> (As a side note, how I<would> one declare that a sub is expecting a
> sub whose return value can be assigned to?)
> 
> ----------
> 
> In conclusion, there should be a different keyword for attributing
> traits as for inheritance/tying.  Some possibilities:
> 
>   Inheritance/Tying:
>     is   (assuming traits have something different)
>     isa
>     uses
>     as
>     is/tied  (would work if traits can't be given to entire classes)
>   Traits:
>     is
>     where
> 
> The former is more likely to change if anything is.
> 
> Luke

Reply via email to