Perl Monk, Perl Meditation PerlMonks

### Re: Ternary vs. Sort vs. Max

by Athanasius (Bishop)
 on Aug 10, 2015 at 14:08 UTC ( #1138037=note: print w/replies, xml ) Need Help??

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::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.

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

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

Create A New User
Node Status?
node history
Node Type: note [id://1138037]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others rifling through the Monastery: (6)
As of 2021-01-19 15:52 GMT
Sections?
Information?
Find Nodes?
Leftovers?
Voting Booth?
The STEM quote I most wish I'd made is:

Results (203 votes). Check out past polls.

Notices?