On Mon, Nov 07, 2005 at 01:05:16PM +0100, TSa wrote:
: With the introduction of kind capture variables ^T we could complety
: drop the subtype special form. As you pointed out the adding of constraints
: happens with the where clause anyway. Thus we return to the usage of the
: compile time name assignment form
: 
:   ::Blahh ::= ::Fasel where {...}
: 
: where the :: in all cases means working on the MIR (Meta Information
: Repository) which is the world of names (In Russian, Mir (Мир) means
: "peace," and connotes "community." --- cited from Wikipedia).

Except that a type declarator can remove the need for all those extra ::
markers.  (Actually, the ::Fasel can be presumably written Fasel if
Fasel is already declared, so the only strangeness is on the left.
We could hack identifier-left-of ::= like we did identifier-left-of =>,
or we could turn ::= into more of a general alias macro idea.  But I think
people generally like declarators out to the left for readability.)

: Question: shouldn't there be a natural 1 to 1 relation of ::T and ^T
: or globally ::*T and ^*T where the former is the name and the latter
: the kind represented by T? Of course scoping applies and there are
: anonymous things that can be captured into ^T vars at runtime.

Yes, that's basically how I see it.  ::T is the literal form, ^T is the
free form, but both map to package T in some scope or other.

: If the answer is 'yes' as I expect, I wonder if the compiler has to restrict
: the usage of ::= to scopes which don't depend on runtime evaluations like
: 
:    if $x < 10 { ::*Surprise ::= ::*FunnyType; say 'did it'; }
: 
: Or should these be extracted out, making the above mean
: 
:    ::*Surprise ::= ::*FunnyType; # or further out if necessary
: 
:    if $x < 10 { say 'did it'; }

To me it's similar to

    my $x = 1 if $y;

which should probably just be disallowed or warned about under strict.
On the other hand, the declarations in a class file are also contingent
on the class being used, so those declarations are also in a conditional
context.  So maybe we should just declare such things to be erroneous.

: >: Question: does a subtype declaration work only on package-like things
: >: which are addressed with a :: sigil? Or does your 'potentially
: >: contravariant' mean that arrow types can be constraint or aliased, as
: >: well?
: >: 
: >:   subtype TakesInt of Sub where { .sig =:= :(Int --> Any) };
: >: 
: >:   my TakesInt &foo;
: >: 
: >:   foo('a string'); # type error
: >
: >Hmm, I would read that as declaring that &foo *returns* a TakesInt,
: >not that &foo *is* a TakesInt.  Just as
: >
: >    my TakesInt @bar;
: >
: >declares an array of individual TakesInt elements.
: 
: This is not too bad because then the & sigil is naturally associated
: with the :( --> ) arrow type syntax and the forms can be mixed only
: to the extent of signature aliasing:
: 
:     ::Takes3Ints ::= :(Int,Int,Int --> Any);
: 
:     my &foo:(Takes3Ints);

I'd say that has to be something like:

    my &foo:(Takes3Ints:);

or maybe one of

    my &foo:(Takes3Ints \!);
    my &foo:(\Takes3Ints);
    my &foo\(Takes3Ints);

since Takes3Ints is the implementation and/or arglist type.
Otherwise how do you distinguish

    my &foo:(Takes3Ints);
    my &foo:(Int, Int, Int);

: How does arrow typing apply to the three data sigils $, @ and %?
: Compare:
: 
:     my $foo:(Int); # non-referential value type
:     my $foo:(-->Int); # same? Or perhaps means anonymous ref/link/alias?
:     my $foo:(Ref-->Int) # explicit reference? same as 'is ref' trait?
:     my $foo:(Item: -->Int) # tied container
: 
: Which is the default when the Int is used in the type slot of the
: declaration?
: 
:    my Int $foo;

That means

   my $foo:(-->Int);

: Could this be used to define the key type of hashes?
: 
:    my %foo:(Blahh-->Any);
: 
: And shape of arrays
: 
:    my @foo:(Int,Int,Int-->Any);
: 
: where the Int or subtypes of it are enforced and Any defaulted.

Certainly.  I wouldn't mind getting rid of the "shape" property.

: Thus this could just be
: 
:    my @foo:(!,!,!);

Yeah, though that doesn't mean you can't write @foo[1] and get a :(!,!)
out of it.

: The covariant invocant/container types are of course
: 
:    my $item :(Item:      --> Any);
:    my @array:(Array: Int --> Any);
:    my %hash :(Hash:  Key --> Any);
: 
: The & sigils have a free signature and ^ vars obviously have no signature
: other than pure type ;)

Works for me.  As with & sigs, we might be able to lose the colon in
a declarative context:

   my $item(Item:      --> Any);
   my @array(Array: Int --> Any);
   my %hash(Hash:  Key --> Any);

The colon would still be required in an rvalue context.  But the extension
of that to subs seems to be:

    my &sub(Sub: \$args)

Hmm, does that mean that a method actually looks like this?

    my &meth(Method: $self: \$args)

I also wonder about hybrid hash/arrays:

   my %harry(HashArray:  Key^Int --> Any);

It would be nice to generalize this sufficiently to be able to declare
polymorphic objects resembling match objects:

   my $matchobj(Poly:  Key^Int^Notthere --> Any);

Or maybe that should be:

   my $matchobj\(Highlander);

:-)

Larry

Reply via email to