NAME
Compile::Generators - Python-like generator subroutines for Perl
SYNOPSIS
use Compile::Generators;
sub gen_range :generator {
my ($min, $max) = @_;
my $num = $min;
my $incr;
while (not defined $max or $num < $max) {
$incr = shift || 1;
yield $num;
$num += $incr;
}
}
my $range = gen_range(50, 100);
my $i = gen_range(1);
while (my $num = $range->($i->())) {
print "\$num => $num\n";
}
When run, this prints:
$num => 50
$num => 51
$num => 53
$num => 56
$num => 60
$num => 65
$num => 71
$num => 78
$num => 86
$num => 95
DESCRIPTION
Compile::Generators lets you define subroutines that return their code
as a generator. You can then call the generator over and over until it
returns an empty list. The generator can yield (return) a value and then
when you call it again it resumes right after the yield.
USAGE
Any subroutine marked with the a ":generator" attribute will have its
code wrapped into a closure and returned by the subroutine. Any yield
statements will be replace with code to return/resume at that point.
Any code before the first blank line in the sub will not be a part of
the closure but will be executed when the sub is actually called. This
means that any variables that are defined before the blank line will be
*closed* by the generator sub.
This module uses Module::Compile to compile the generators. Look inside
the ".pmc" to see what is really happening.
Since this module uses "goto" statements, you cannot "yield" inside a
"for" loop. Perl does not allow this. However you *can* use "while"
statements.
Currently a "yield" statement needs to be a simple statement on it's own
line, since this gets parsed and replaced by a return/goto-label.
See the tests for examples.
AUTHOR
Ingy döt Net <
[email protected]>
COPYRIGHT
Copyright (c) 2006. Ingy döt Net. All rights reserved.
This program is free software; you can redistribute it and/or modify it
under the same terms as Perl itself.
See <
http://www.perl.com/perl/misc/Artistic.html>