Beefy Boxes and Bandwidth Generously Provided by pair Networks
No such thing as a small change
 
PerlMonks  

Re^5: RFC: Accelerated stepping

by hexcoder (Curate)
on Sep 07, 2008 at 19:24 UTC ( [id://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)) {
to
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.

This

# 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        

      Oops,

      thanks for your comment, I missed that.

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others pondering the Monastery: (5)
As of 2024-04-25 09:50 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found