Perl6::Take - gather/take in Perl 5


Perl6-Take documentation Contained in the Perl6-Take distribution.

Index


Code Index:

NAME

Top

Perl6::Take - gather/take in Perl 5

SYNOPSIS

Top

    use Perl6::Take;

    my @foo = gather {
        take 5;
    };

EXPORT

Top

gather

Accepts a block. take statements inside the dynamic scope of the block are used to accumulate a list, which is gathered as the return value of the block.

take

Accumulates its argument (or list of arguments) on to the nearest gather in the dynamic scope. Arguments are evaluated in list context. The arguments may be passed on to a variable, but note that this assignment should usually be done in list context, as per usual context rules:

    $answer   = take 42; #  1
    ($answer) = take 42; # 42

AUTHOR

Top

Gaal Yahas, <gaal at forum2.org>

BUGS

Top

Please report any bugs or feature requests to bug-perl6-gather at rt.cpan.org, or through the web interface at http://rt.cpan.org/NoAuth/ReportBug.html?Queue=Perl6-Take. I will be notified, and then you'll automatically be notified of progress on your bug as I make changes.

SUPPORT

Top

You can find documentation for this module with the perldoc command.

    perldoc Perl6::Take

You can also look for information at:

* AnnoCPAN: Annotated CPAN documentation

http://annocpan.org/dist/Perl6-Take

* CPAN Ratings

http://cpanratings.perl.org/d/Perl6-Take

* RT: CPAN's request tracker

http://rt.cpan.org/NoAuth/Bugs.html?Dist=Perl6-Take

* Search CPAN

http://search.cpan.org/dist/Perl6-Take

ACKNOWLEDGEMENTS

Top

COPYRIGHT (The "MIT" License)

Top


Perl6-Take documentation Contained in the Perl6-Take distribution.
package Perl6::Take;

use warnings;
use strict;

use Carp;

our $VERSION = '0.04';

our @GATHER;

sub gather (&) {
    # We used to push and pop ourselves, but local's easier for cleanup
    # purposes, and since the gather stack only contains references to the
    # takelists, copying it isn't expensive. Unless you have like a couple
    # thousand nested gathers, in which case you're beyond my help.
    local @GATHER = (@GATHER, []);

    # Here needs to come some trick to see the code didn't explicitly say
    # "return". But that's presumed impossible in pure Perl 5.
    shift->();

    return @{ $GATHER[-1] };
}

sub take (@) {
    Carp::croak("take with no gather") unless @GATHER;
    Carp::confess("internal error: gather cell not a listref") unless
            ref $GATHER[-1] eq 'ARRAY';
    Carp::croak('take with no args, did you mean "take $_"?') unless @_;

    push @{ $GATHER[-1] }, @_;
    return @_; # for possible en passant assignment
}

sub import {
    my $caller = caller;
    no strict;
    *{"$caller\::gather"} = \&gather;
    *{"$caller\::take"}   = \&take;
}

1;

__END__