On Sat Sep 05 07:47:24 2015, dakkar wrote:
> Given this code::
> 
>   {
>     class Foo { has $.x }
> 
>     multi sub infix:<eqv>(Foo $a, Foo $b) {
>       say "won't get called";
>       $a.x eqv $b.x
>     }
>   }
> 
>   multi sub infix:<eqv>(Foo $a, Foo $b) {
>     say "will get called";
>     $a.x eqv $b.x
>   }
> 
>   my @a = Foo.new(:x(1));
>   my @b = Foo.new(:x(1));
> 
>   say @a[0] eqv @b[0];
>   say @a eqv @b;
> 
> the output is::
> 
>   will get called
>   True
>   False
> 
> because:
> 
> - the first ``eqv`` definition is not visible to any of the calls
> - the second ``eqv`` definition is not visible to the
>   ``infix:<eqv>(@a,@b)`` in the setting
> 
This is correct; multis are lexically scoped.

> This means that:
> 
> - ``eqv``s defined in other packages are never used
Well, they are in the lexical scope of the package.

> - adding a ``eqv`` for users' types is not very useful, since they
>   won't be called most of the time
> 
Typically you'll be writing such types in a module; adding "is export" to the 
eqv multi candidates you declare will export them, and then they'll be 
available to anyone importing your type. And if you're in a single file, you 
can still write them inside of a package and then "import" that package to get 
them into scope.

> Should there be some mechanism like ``ACCEPTS`` to make ``eqv`` more
> useful?
> 
No, given then you'd be able to apply this argument to every other operator in 
the language you might consider overloading.

> Should there be a mechanism to add ``multi`` candidates dynamically?
>   
We have to know the list of multi-candidates at CHECK time; since export/import 
happen at BEGIN time, then that's enough "static dynamism" for this case.

Hope this helps,

/jnthn

Reply via email to