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 >>>> #