> -----Original Message-----
> From: Larry Wall [mailto:[EMAIL PROTECTED]
> Sent: Friday, December 12, 2003 1:44 PM
>


> Potentially, though roles are more properly thought of as types
> than classes.
> That is, they're abstract sets of values.  You can instantiate
> one sufficiently
> well to take a reference to it, so that you can do
>
>     $someobject but= $somerole;
>
> But it's not really an object in its own right, and it's not clear that
> you can call any of the methods it defines unless it's part of an object.

Presumably it will share whatever behavior Classes use to provide "static"
methods?

> : Then assuming that certain objects "inherit" certain roles, you could
> : use something like the Perl 5 $self->SUPER::new() syntax.  Only it would
> : look more like this:
> :
> :     $foo->Boolean.true
> :     $bar->Color.red
> :     $baz->Int.byte
>
> Well, we can't use -> because we're using that for something else.
> But it's certainly true that we'll have to have some mechanism for
> disambiguating Color.green from Blackberry.green.  After all,
>
>     Blackberry.green == Color.red
>
> Or maybe it's
>
>     Blackberry::green == Color::red
>
> I'm not sure how subtypes are related to types yet, syntactically
> speaking.
> Might even be
>
>     Blackberry[green] == Color[red]

This syntax suggests a javascript-like similarity between classes (or
objects) and arrays. Do you want that?
Perhaps pretending hashiness would be truer to both Perl's roots and the
syntax used to construct things:

  my &member_function = \Class{memberfunction};

  Blackberry{green} == Color{green}


> : > Another implication is that, if properties are subtypes, we can't use
> : > the same name as a cast method.  Since
> : >
> : >     $baz.Byte
> : >
> : > only returns true or false, we'd need something like (yuck)
> : >
> : >     $baz.asByte
> : [...or...]
> : >     $baz.as(Byte)
> :
> : Or:
> :       $baz->Byte
> :
> : That would make something like this:
> :
> :       $foo->Color.red
> :
> : the same kind of thing as:
> :
> :       $foo.as(Color).red
>
> I'm thinking the ordinary method
>
>     $foo.Color
>
> implies
>
>     $foo.as(Color)
>
> meaning that we're viewing $foo through the Color filter.  If you want to
> match against a value, however, you'd have to say
>
>     $foo.Color == green
>
> or
>
>     $foo.Color ~~ green
>
> In the latter case, you can just say
>
>     $foo ~~ green
>
> as long as "green" is unambiguous.  I don't know the syntax for
> disambiguating on the green end yet.  Maybe one of
>
>     $foo ~~ Color::green
>     $foo ~~ Color.green
>     $foo ~~ Color[green]
>
> Or maybe something else.
>
> The interesting question to me is what
>
>     $ref = \$foo.as(Color);
>
> returns.

I'll suggest:

  $ref = \$foo.as(Color);

be the same as:

  $ref = \$foo;
  $ref but= of Color; # C<of> affects type assumptions, doesn't merely add
stuff.

So that $ref is typechecked as a Color, not as a Foo.

> It looks like a typed reference to me, but it's still
> a reference to the object in $foo, or can behave as one somehow.
> I don't think it should generate a reference to the bare role, because
> roles aren't intended to be first class objects (though you can force
> them to be, I think).  Roles are supposed to encapsulate abstractions
> without implying objecthood.  I think roles are a little bit like
> quarks--they're fine in theory, but it's scary to have loose ones
> floating around.
>
> So it seems to me that $foo.Color has to return some kind of typed ref
> to $foo, so that things like
>
>     $foo.Color = purple;
>
> can work as expected.  Staring at that, it seems apparent that .Color
> is simply an lvalue subroutine just like any other rw attribute.  An
> lvalue sub can be thought of as a typed reference, I suppose.  It gets
> more interesting if the role has multiple attributes though.  What
> would
>
>     \$foo.RGB
>
> return, I wonder, such that
>
>     $foo.RGB = ($r,$g,$b)
>
> would work?
>
> Larry

Reply via email to