http://qs321.pair.com?node_id=1138037


in reply to Ternary vs. Sort vs. Max

Hello QM,

Another — possibly heretical? — option is to make max an inline function using a module such as macro:

#! perl use strict; use warnings; use macro max => sub { $_[0] > $_[1] ? $_[0] : $_[1]; }; my $x = $ARGV[0]; my $y = $ARGV[1]; my $m = max($x, $y); print "max is $m\n";

Output:

0:05 >perl 1334_Med.pl 17 12 max is 17 0:05 >perl -MO=Deparse 1334_Med.pl Compiling 1334_Med.pl by macro::compiler/0.06 ... sub Digest::base::new; sub Digest::base::clone; sub Digest::base::add; sub Digest::base::digest; use macro ('max', sub { use warnings; use strict; $_[0] > $_[1] ? $_[0] : $_[1]; } ); use warnings; use strict; my $x = $ARGV[0]; my $y = $ARGV[1]; my $m = $x > $y ? $x : $y; print "max is $m\n"; 1334_Med.pl syntax OK 0:05 >

Hope that helps,

Athanasius <°(((><contra mundum Iustus alius egestas vitae, eros Piratica,

Replies are listed 'Best First'.
Re^2: Ternary vs. Sort vs. Max
by QM (Parson) on Aug 10, 2015 at 15:55 UTC
    Hi Athanasius,

    The macro is indeed interesting, as I've not delved in there before.

    However, that may suffer from techical debt. If I define a max macro that only handles 2 values, I (or my replacement) may call it later and give it 3 values, and only get the max of the first 2. Still, some careful coding (probably duplicating List::Util's max) could ensue.

    Edited to add:

    Also, it seems the macro syntax uses significant whitespace, which bugs me.

    Edited to add (2):

    The macro doc page has this:

    use macro add => sub{ $_[0] + $_[1] }; say => sub{ print @_, "\n"}; say(add(1, 3)); # it's replaced into 'print do{ (1) + (3) }, "\n";'
    which I'm assuming uses significant whitespace to figure out that say is a macro. (Or there's a typo semicolon on the first line.)

    -QM
    --
    Quantum Mechanics: The dreams stuff is made of

      It’s just a typo:

      19:13 >perl pod.pl Useless use of a constant ("say") in void context at pod.pl line 6. Useless use of single ref constructor in void context at pod.pl line 6 +. Undefined subroutine &main::say called at pod.pl line 7. 19:39 >

      Whereas with a comma instead of the semicolon:

      19:39 >perl pod.pl 4 19:41 >perl -MO=Deparse pod.pl Compiling pod.pl by macro::compiler/0.06 ... sub Digest::base::clone; sub Digest::base::new; sub Digest::base::digest; sub Digest::base::add; use macro ('add', sub { use warnings; use strict; $_[0] + $_[1]; } , 'say', sub { use warnings; use strict; print @_, "\n"; } ); use warnings; use strict; print 4, "\n"; pod.pl syntax OK 19:41 >

      Hope that helps,

      Athanasius <°(((><contra mundum Iustus alius egestas vitae, eros Piratica,

        I raised ticket 106366 for that.

        -QM
        --
        Quantum Mechanics: The dreams stuff is made of