Beefy Boxes and Bandwidth Generously Provided by pair Networks
Don't ask to ask, just ask

Re^5: RFC: Accelerated stepping

by hexcoder (Deacon)
on Sep 07, 2008 at 19:24 UTC ( #709679=note: print w/replies, xml ) Need Help??

in reply to Re^4: RFC: Accelerated stepping
in thread RFC: Accelerated stepping

I just found out, that if you modify the example Perl code from
if (0 < scalar grep { $_ == 9 } (1..10)) {
if (0 < scalar grep(sub { $_ == 9 }, (1..10))) {
then 'n' does step over the whole grep command at once!

Update: thanks to tye for noticing an error in the above code. Obviously the code

if (0 < scalar grep(1, (1..10))) {
does not involve a code block, and consequently is stepped over with a single 'n'.

For map and sort the behavior looks a bit different, since the operator prototypes are not orthogonal :-(.
sort wants something like ::mycmp (no sigil, so what is the name of that type?).
These examples

print '1. ', (join q{,}, sort qw(a z b y)), "\n"; print '2. ', (join q{,}, sort { $a cmp $b } qw(a z b y)), "\n"; print '3. ', (join q{,}, sort(::mycmp qw(a z b y))), "\n"; sub mycmp { return $a cmp $b; }
work, and will give these results:
example '1.' will be stepped over by 'n', while examples 2./3. are non stepped over with 'n'.
So, only if you supply your own comparison, 'n' steps into it.

The same goes for map, except that map only works with a code block.


# panics print 'map2', (join q{,}, map(::myuc qw(a z b y))), "\n"; sub myuc { return uc($_[0]); }
causes a panic from the Perl interpreter during compile time!

Finally the operators from List::Util and List::MoreUtils (c implementation) are stepped over with 'n'.

So I think the inconsistency in behavior is caused by the Perl interpreter, namely the treatment of code references/blocks as parameters of operators. So the behavior should better be changed there. I will contact p5p.

Replies are listed 'Best First'.
Re^6: RFC: Accelerated stepping (true sub)
by tye (Sage) on Sep 08, 2008 at 00:44 UTC
    grep sub { ... }, @list

    never runs the anonymous subroutine and always returns all of @list since a code ref evaluates to 'true' in a Boolean context.

    - tye        


      thanks for your comment, I missed that.

Log In?

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://709679]
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others chanting in the Monastery: (5)
As of 2022-08-17 10:31 GMT
Find Nodes?
    Voting Booth?

    No recent polls found