Larry Wall wrote:
> Jonathan Worthington wrote:
>  > role Bar { }
>  > my Bar $x;   # $x is ???
>  > say $x;          # ???
>  > say $x.WHAT; # ???
>  > # This means we can only assign to $x something that does Bar?
>
>  Correct, and for the same reason.  The container checks the role--it
>  has little to do with what's in $x currently, which *cannot* have
>  the type of Bar, since you can't instantiate that.
>
>
>  > subset EvenInt of Int where { $_ % 2  == 0 };
>  > my EvenInt $x;  # $x is ???
>  > say $x;              # ???
>  > say $x.WHAT;  # Failure?
>  > # This means we can only assign to $x something that matches the constraint
>
>  Yes, again, checked by the container, not by $x.  $x cannot have the
>  type of a subset either!  The actual type of $x is Int.  Objects may
>  only be blessed as valid storage types of some kind or other.  Subsets
>  are merely extra constraints on a storage type (here Int).
>
>
>  > class Dog { }
>  > class Cat { }
>  > my Dog|Cat $x;  # $x is ???
>  > say $x;               # ???
>  > say $x.WHAT;  # Failure?
>  > # This means we can only assign to $x something that isa Dog or isa Cat
>
>  Well, maybe $x is just Object, or whatever is the closest type that
>  encompasses both Dog and Cat.  But note that Object is just the most
>  generic kind of undef, so this is more or less equivalent to doing
>  no initialization in p5-think.  I don't think I'm interested in making
>  the run-time system calculate a Dog|Cat storage type, so it comes out
>  to just a constraint.
>
>  Really, the main reason we initialize with an undef of the correct sort
>  is so that you can say
>
>     my Dog $x .= new();
>
>  But what would (Dog|Cat).new() do?  Constructors are not required to
>  know about subset types or roles.  Constructors just create plain ordinary
>  classes, I expect.  Composition and constraint checking happen
>  elsewhere.

Two questions:

1. Apparently, my presumption that $x.WHAT was for retrieving the
value type was wrong; from the above, it's sounding like it is
supposed to retrieve the implementation type.  Is this correct?  If
so, for what purpose does $x.WHAT exist that you can't do just as well
with $x itself?  If it's for the stringification of the container's
name, couldn't that be accomplished just as easily by means of a
$x.HOW method, such as $x.^name?

2. How _do_ you retrieve the value type of $x?  That is, how can the
program look at $x and ask for the constraints that are placed on it?
I don't see $x.HOW being useful for this, since HOW is essentially
there to let you look at the inner workings of the container; and none
of the other introspection metamethods in S12 come close to addressing
this question.

-- 
Jonathan "Dataweaver" Lang

Reply via email to