(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
