On Mon, Sep 04, 2006 at 10:52:35PM -0700, Trey Harris wrote:
: In a message dated Tue, 5 Sep 2006, Ph. Marek writes:
: >I now had a look at http://dev.perl.org/perl6/doc/design/syn/S06.html
: >but didn't find what I meant. Sorry if I'm just dumb and don't
: >understand you (or S06); I'll try to explain what I mean.
:
: I don't think you're dumb; the Synopses just require that you intuit
: certain things from each other, from examples in other Synopses, and so on
: in a Perlish sort of way; what you're looking for is not spelled out
: explicitly. It can be found by noticing how you specify subtypes, along
: with noticing that subtypes can be specified as parameter types. There's
: also an example showing explicitly what you want in S12.
:
: >In Perl5 this looks like
: >
: > sub SomeThing
: > {
: > my($a, $b)[EMAIL PROTECTED];
: >
: > return b+2 if ($a == 4);
: > return a+1 if ($b == 3);
: > return a*b;
: > }
: >[...]
: >What I am asking is whether there will be some multimethod dispatch
: >depending
: >on the *value*, not the *type*, of parameters.
: >Perl6 could possibly do something with "given"; but matching on multiple
: >variables seems to be verbose, too.
: >I'm looking for something in the way of
: >
: > sub SomeThing(Num $a, Num $b) where $a==4 is $b+2;
: > sub SomeThing(Num $a, Num $b) where $b==3 is $a+1;
: > sub SomeThing(Num $a, Num $b) { return $a * $b }
:
: It's just
:
: multi sub SomeThing(Num $a where {$^a == 4}, Num $b) { $b + 2 }
: multi sub SomeThing(Num $a, Num $b where {$^b == 3}) { $a + 1 }
: multi sub SomeThing(Num $a, Num $b) { $a * $b }
:
: >but without specifying the signature multiple times (or maybe we should,
: >since
: >it's MMD). Now
:
: Yes, the signatures are different--the first two multis specify subtypes
: as their signatures, the last specifies a canonical type.
Every scalar value is a one-element subset of its type, so you can just write:
multi sub SomeThing(Num 4, Num $b) { $b + 2 }
multi sub SomeThing(Num $a, Num 3) { $a + 1 }
multi sub SomeThing(Num $a, Num $b) { $a * $b }
or even just
multi sub SomeThing(4, Num $b) { $b + 2 }
multi sub SomeThing(Num $a, 3) { $a + 1 }
multi sub SomeThing(Num $a, Num $b) { $a * $b }
Though 3 and 4 are arguably going to match against Int rather than Num...
Larry