TSa wrote:
> Jon Lang wrote:
>
> > My thoughts:
> > .HOW returns information concerning the implementation type; .WHAT
> > returns information concerning the value type.
BTW, S12 more or less confirms the above: .WHAT returns a prototype
object that stringifies to its short name, while .HOW allows
introspection of the attributes and methods and composed roles and
inherited classes and...
> My addition to these thoughts is that the WHAT and HOW are
> cascaded. Let's say we start at level 0 with the objects,
> thingies or however we want to name the atoms of our discourse.
> At the zero level HOW, WHAT etc. are vacuously identical with
> the object. They fall apart on level 1 from each other and among
> them selfs but they are all sets of level-0 objects. In general
> a level n concept contains level 0..^n "objects" and is the name
> for a something they share.
In English, please?
I _think_ that you're saying that you can use WHAT and HOW
recursively: that is, you can talk about WHAT.WHAT, WHAT.HOW,
HOW.WHAT, HOW.HOW, etc. If so, note a few caveats:
first, if $x is a Foo, then $x.WHAT will be a Foo. As such, there is
no difference between $x.WHAT and $x.WHAT.WHAT. Likewise, forget
about my comments about $x.WHAT.HOW; since $x is of exactly the same
type as $x.WHAT, you can get the same information by saying $x.HOW as
you could about $x.WHAT.HOW.
Second, $x.HOW.WHAT gives you a prototype of the metaclass object. If
you're ever doing type checking that refers to the "metaclass class",
this might be useful; otherwise, don't bother.
Third, $x.HOW.HOW would let you look at the inner workings of the
"metaclass class". Going beyond that would be redundant, since you'd
be using a metaclass object to look at the metaclass class.
> > > role Bar { }
> > > my Bar $x; # $x is ???
> > > say $x; # ???
> > > say $x.WHAT; # ???
> > > # This means we can only assign to $x something that does Bar?
> > >
> >
> > This one's tricky: roles cannot be instantiated, so .WHAT cannot be a
> > Bar.
>
>
> What? I would say it is a level 1 WHAT. The next level concept
> $x.WHAT.WHAT is role. BTW, there are not very many levels up.
Again, English please?
As I said, roles cannot be instantiated. $x is not a Bar; it is an
object of an anonymous class that does Bar. $x.WHAT is a prototype
object of $x, meaning that it, too, is an object of an anonymous class
that does Bar. The only difference between them is that $x may
eventually have a value assigned to it; $x.WHAT never will. Well...
that, and $x.WHAT stringifies differently than $x does.
> > > 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
> >
> > my guess: .WHAT is an EvenInt that stringifies to "EvenInt". If you
> > want to know about the structure of EvenInt (e.g., which class is it
> > based on, and which subset restrictions have been applied to it), you
> > would refer to .WHAT.HOW.
>
> I would argue that $x.WHAT.WHAT is subset. I think the
> idea of introspection is to have $x.WHAT.of return Int
> as a level 1 WHAT and $x.WHAT.where return the constraint
> closure. That said I would expect $x.HOW to be the identical
> level 1 HOW object that $x.WHAT.of.HOW returns. When Int.WHAT.WHAT
> is a role then this is undef of Int.
Ah; _that's_ what you mean by cascading levels. Ugh.
By my understanding, $x and $x.WHAT are both the same kind of thing:
they're both EvenInt. Again, the only difference is that $x.WHAT will
always be undefined and will stringify to "EvenInt".
> > > 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
> >
> > my guess: .WHAT is a Junction that stringifies to "Dog|Cat". To
> > access the details as to which classes are in the junction and how
> > they are joined, refer to appropriate methods (I believe that Junction
> > includes a method that returns a Set of its members) or maybe to
> > .WHAT.HOW.
>
> On level 1 the WHATs of Dog and Cat are distinct. Dog|Cat is a level 2
> WHAT. The level 2 $x.WHAT.HOW is a union. $x.WHAT.WHAT is class.
Huh?
--
Jonathan "Dataweaver" Lang