(or "Allowing built-in functions to use loop blocks")
Reply-To: [EMAIL PROTECTED]
This and other RFCs are available on the web at
http://dev.perl.org/rfc/
=head1 TITLE
Short-circuiting C<grep>, C<map>, and C<reduce> with C<last>
(or "Allowing built-in functions to use loop blocks")
=head1 VERSION
Maintainer: Garrett Goebel <[EMAIL PROTECTED]>
Date: 6 Sep 2000
Last Modified: 7 Sep 2000
Mailing List: [EMAIL PROTECTED]
Number: 199
Version: 2
Status: Developing
=head1 ABSTRACT
Allow built-in functions like C<grep>, C<map>, and C<reduce> which take
blocks as a parameter to be short-circuited with C<last>
=head1 DESCRIPTION
It'd be nice if one could use C<grep> to find out if a value is
held in a list without having to iterate through every element
of said list. It would follow that one should also be able to
label such built-in functions.
Damian already has plans for C<reduce> that would
require this. I'm sure others can figure out their own uses for
short-circuiting C<grep>, C<map>, and C<reduce>.
Adoption of this suggestion would create problems with any Perl 5 code
that goes against conventional wisdowm and uses C<last> within a C<grep>
or C<map> block. The workaround would require the Perl 5 to 6 translator
to generate labels for any unlabled C<next>, C<last>, and C<redo>
statements and their associated C<while>, C<until>, C<for>, and
C<foreach> statements.
Neither Tom Christiansen nor Jarkko Hietaniemi profess to know why the
suggestion with regards to C<grep> hasn't already been implemented.
Perhaps it has to do with the fact that the blocks in C<grep> and C<map>
are only appear to be loops, where as C<while>, C<until>, C<for>, and
C<foreach> are loops. I have practically no knowledge of the Perl
internals or possible history related to this issue. Please
enlighten me, and I'll include it in a later revision of this RFC.
If a the built-in's block were terminated by a call to C<last>,
the built-in immediately returns the last block value (i.e.
C<undef> on the first block call, $_[0] otherwise). Or maybe that's
@_ otherwise... someone straighten me out please.
@a = grep( {$_ < 3 or last } (1, 2, 3, 2, 1);
results in:
@a = (1, 2);
@a = grep( { {$_ < 3 or last} } (1, 2, 3, 2, 1);
results in:
@a = (1, 2, 2, 1);
=head1 IMPLEMENTATION
I haven't a clue. Please feel free to suggest one for the next revision.
=head1 REFERENCES
RFC's that require this functionality:
RFC 76: Builtin: reduce
Ideas that offer alternative routes to similar functionality:
RFC 22: Builtin switch statement
RFC ??: Damian Conway's forthcoming superpositions RFC