On Aug 9, 2005, at 10:52 AM, TSa wrote:
>> ~ Foo ~
>> Is a type that variables etc. can be declared to have
>> Is not an object
>> => I'm really not sure about this...
>
> Bare Foo is a namespace lookup.
Yes, TSa is right. Everything below this is Type-stuff and I will leave
that to him (up until the Meta part that is).
> The associated type
> is something like 'direct instance of Foo'. It is
> checked with the .does method. This type is then
> used as type parameter to constrain one of the Fantastic
> Four ($&@%):
>
> my Foo $foo; # $foo now of type 'Undef of Foo'
>
> foo = Foo.new; # type correct because Foo.new.does(Foo)
>
>
>> ~ class(Foo) ~
>> Used as the invocant of class methods
>> => Any other purpose?
>> Is an object; instance of the 'Class' class
>
> From the type system point of view class(Foo) is a Class type.
> But that is what bare Foo means anyway if the innermost entry
> in the namespace was generated from the class special form.
>
>
>> => How do we get properly-typed access to members that class(Foo)
>> has
>> that aren't declared in 'Class'?
>
> Sorry, I don't understand that. What do you want to access?
> Private class data? Or even lower level implementation details?
> Everything else should be accessible through namespace syntax:
>
> &Foo::action(); # action call through Code ref
> $Foo::attr; # data slot access
> @Foo::attr[42] # array slot
>
> given Foo # binds block owner $/ to Foo, $_ from outside
> {
> &::action(); # &action() etc. work as well
> $::attr;
> @::attr[42];
>
> # or with my idea of slot accessor expressions
> # bound through $/ := Foo
>
> &.action();
> $.attr;
> @.attr[42];
>
> # or with method dispatch that does not necessarily
> # end up calling a slot in Foo
>
> my method action # hide OUTER::action
> {
> say "no Foo method but invocant.does(Foo) is $/.does(Foo)";
> # what would next METHOD call here?
> }
> # Note that 'my multi method action' would temporarily install
> # action in an existing outer multi or create a new local one and
> # and install an outer non-multi in it or some such.
> # I'm not the dispatch Guru ;)
>
> .action(); # prints "no Foo method but invocant.does(Foo) is true"
> .attr; # MMD could select Foo::Item::attr accessor
> .attr[42]; # MMD could select &postfix:<[ ]>(Foo::Array::attr, 42)
> }
>
>
>> ~ meta(Foo) ~
>> Members contain info /about/ Foo, rather than /of/ Foo
>> => This is to avoid name-clashes with 'name', 'authority' etc.
>> Is an object; instance of the 'MetaClass' class
>
> If avoiding name clashes is all, a simple Foo::META pseudo
> namespace and %META hash would do. Why a MetaClass and instances of it?
Avoiding name clashes is one point, and I tried the Foo::META thing at
one point. Actually the current meta-model grew out of that early
prototype, but soon it outgrew that. IIRC it lead to a lot of code
duplication, which likely was an implementation detail.
> I hope that .isa, .does and .meta are normal Method subtypes and *not*
> slots on some implementation objects/structures.
I am not sure I understand this. Can you elaborate?
Stevan
> --
> $TSa.greeting := "HaloO"; # mind the echo!
>
Thread Previous
|
Thread Next