in reply to Re: Re: A set of new operators. In keeping with the design of Perl?
in thread A set of new operators. In keeping with the design of Perl?
You need a 'min_str', min_str_i' and 'min_num' to really cover all bases.You can get most of the way there with multimethods. Which, fortunately, Perl 6 has:
multi max (Str *@candidates) { reduce {$^a gt $^b ?? $^a :: $^b} @candidates; } multi max (Num *@candidates) { reduce {$^a > $^b ?? $^a :: $^b} @candidates; }
However, I suspect that won't be sufficiently Lazy for Perl 6. So my preference is for a max function that selects what kind of comparison to do, based on call context:
And to get all the way there (i.e. to allow for user-specified comparisons such as case-insensitive), max would have an optional closure argument (just as sort does now) so that the comparator could be explicitly specified:sub max (*@args) { if want~~Str { reduce {$^a gt $^b ?? $^a :: $^b} @args } else { reduce {$^a > $^b ?? $^a :: $^b} @args } } $biggest_str = ~max @values; # Str context, so use gt $biggest_num = +max @values; # Num context, so use > $biggest_num = max @values; # scalar context, default to >
# Let call context decide... multi max (*@args) { if want~~Str { reduce {$^a gt $^b ?? $^a :: $^b} @args } else { reduce {$^a > $^b ?? $^a :: $^b} @args } } # Let the user specify... multi max (&compare, *@args) { reduce {compare($^a,$^b)>=0 ?? $^a :: $^b} @args; } $biggest_str = ~max @values; $biggest_num = +max @values; $biggest_num = max @values; $biggest_mag = max {abs $^a <=> abs $^b} @values; $biggest_lookup = max {%hash{$^a} cmp %hash{$^b} @values;
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re: Re: Re: Re: A set of new operators. In keeping with the design of Perl?
by BrowserUk (Patriarch) on May 20, 2003 at 08:24 UTC | |
by TheDamian (Vicar) on May 20, 2003 at 22:03 UTC | |
by BrowserUk (Patriarch) on May 20, 2003 at 23:13 UTC |