Daniel’s solution taught me to not ignore the simple numeric coercion operator: 
`+`.
I was trying to improve version just now, using `0 + $_` in a grep, and got 
hung up on the error thrown on failed numeric conversion.
I ended up with:
        .grep: { try 0 + $_ };
Which does work, and might even be better than .grep(+*) , but I totally missed 
the coercion as a shortcut.

A few other thoughts:
        * The original code fails to handle `0.01`, because (0.01).Int is 
exactly Zero, which fails the `!=== 0` before .Rat is ever called.
        * My Regex fails to handle negative numbers, just due to my oversight. 
It also does not handle 0.3 expressed without the leading zero: `.3`
        * All the non-regex solutions (including the original) have unexpected 
effects due to the use of Raku’s numeric conversion; none of these are rejected:
                0xDEADBEEF
                1e15
                0b11
                -0o77
                15/60
        * If the job of the code is “# sums the numbers…”, then we might need a 
clearer definition of Number.
                Is it OK to accept whatever Raku can understand as a number?
                If not, then a stricter filter must be implemented.

I finally settled on using `try` instead of numeric coercion, because if I am 
not golfing, I think `try` makes the grep look more like “filter out the 
non-numbers” instead of “get rid of the zero values”.
Also, I am using a `sub MAIN` with a comment that binds to `WHY` to give a 
better command-line usage message, and using named intermediate variables to 
clarify what we are trying to achieve.


#|(Print the sum of the command-line arguments, but only those arguments that 
are valid numbers)
sub MAIN ( *@possible_numbers ) {
    die $*USAGE if not @possible_numbers;

    my @actual_numbers = @possible_numbers.grep: { try 0 + $_ };
    
    say @actual_numbers.sum;
}


Calling with a `—help` flag, or without arguments, now gives:
$ raku ~/T/d20200831/ee25_e.raku --help
Usage:
  /Users/bruce_pro/T/d20200831/ee25_e.raku [<possible_numbers> ...] -- Print 
the sum of the command-line arguments, but only those arguments that are valid 
numbers

— 
Hope this helps,
Bruce Gray (Util of PerlMonks)

> On Aug 31, 2020, at 2:23 PM, dan...@codesections.com wrote:
> 
> I like Bruce's Regex-based approach.
> 
> Here's how I'd probably approach the problem:
> 
> raku -e 'say [+] @*ARGS.grep(+*)' 0 100 200 300 apples 400oranges 2kilos
> 18.7876 500 grams14 10stars10 sun100moon 77
> 
> August 31, 2020 2:28 PM, "Bruce Gray" <robertbrucegr...@gmail.com> wrote:
> 
>> my $is_a_number = / ^ \d+ [ '.' \d* ]? $ /;
>> 
>> my $sum = @*ARGS.grep($is_a_number).sum;
>> 
>> say $sum;
>> 
>> — 
>> Hope this helps,
>> Bruce Gray (Util of PerlMonks)
>> 
>>> On Aug 31, 2020, at 12:22 PM, William Michels via perl6-users 
>>> <perl6-us...@perl.org> wrote:
>>> 
>>> I think it looks very good, Radhakrishnan! Presumably you are happy
>>> with the sum 1195.7876?
>>> 
>>> ~$ raku -e 'for @*ARGS {.say if ($_.Int // 0) };' 0 100 200 300 apples
>>> 400oranges 2kilos 18.7876 500 grams14 10stars10 sun100moon 77
>>> 100
>>> 200
>>> 300
>>> 18.7876
>>> 500
>>> 77
>>> 
>>> I'm still mulling over whether or not the "!=== 0" is essential. I
>>> have yet to mess-up the command line arguments sufficiently to require
>>> it, and throwing a zero onto the command line seems to be handled
>>> gracefully.
>>> 
>>> Anyone else want to chime in?
>>> 
>>> Best, Bill.
>>> 
>>> On Mon, Aug 31, 2020 at 8:49 AM Radhakrishnan Venkataraman
>>> <weor...@gmail.com> wrote:
>>>> Please see the following script that checks for type and sums up only the 
>>>> numbers passed as
>>>> arguments to the script in the command line. I would be grateful if any 
>>>> improvement or furtherance
>>>> to this script is offered. Thank you.
>>>> 
>>>> #
>>>> # sums the numbers given in command line arguments and prints
>>>> #
>>>> my $sum = 0;
>>>> for @*ARGS
>>>> {
>>>> $sum += $_.Rat if $_.Int // 0 !=== 0;
>>>> }
>>>> say $sum;
>>>> 
>>>> #
>>>> # command line execution
>>>> # perl6 cla.p6 100 200 300 apples 400oranges 2kilos 18.7876 500 grams14 
>>>> 10stars10 sun100moon 77
>>>> #

Reply via email to