Rod Adams wrote:
> It used to be
>    &foo<Array,Int>
>    &foo<Hash,Int>
> but I seem to recall that there was a mild change that occurred. Or
> maybe I'm thinking about the adding of the colon for operators. I'm not
> certain, but it's something very close to the above.
Well, it doesn't seem ambiguous to me. Operators would be in the form
&infix:<-><Num,Num> . But then, I don't design grammars... If enough
people think this syntax could work, I'll add "unspecced" tests to pugs
for it.

> In my mind, the more interesting question is what does &foo without the
> <> specifiers return when foo is multi? I see the following three options:
> 1) undef/error, since there's no single sub called foo, and multi's need
> a postfix <>.
At first I thought this was the right way, but then...

> 2) the name 'foo', and then performs in effect call by name when
> deferenced, using the dereferencing scope to determine which flavors of
> foo are available at this time, and dispatching accordingly.
> 3) a dispatch table of all the foo's currently in scope at the time the
> reference is made. of these is actually necessary. Example:
- I write a module that exports a 'foo' (a sub)
- You use my module, and use that '&foo' to get a ref, which you
subsequently use as you please
- I then change my module so that 'foo' is a multi-sub (this is an
implementation detail, not an API change)
- Your code *must not* break

so we can't return undef. Your #3 seem useful (for introspection, at
least), but what about:

 multi sub foo(Array $a) {return 1}
 multi sub foo(Hash $a) {return 2}

 my $foo_A_H=&foo;

 multi sub foo(Str $a) {return 3}

 print $foo_A_H.('a');

should that print 3? Or coerce 'a' into ['a'] and print 1?

What about (thinking aloud):

 my $foo_static=&foo;
 my $foo_dynamic:=&foo;

where the first one has "snapshot" semantic, as in your #3, and the
second one has 'name' semantic, as in your #2, in the same way that:

 my $a=1;
 my $b=$a;
 my $c:=$a;
 print $b,$c;

prints 1 2 ?

        Dakkar - <Mobilis in mobile>
        GPG public key fingerprint = A071 E618 DD2C 5901 9574
                                     6FE2 40EA 9883 7519 3F88
                            key id = 0x75193F88

Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to