http://qs1969.pair.com?node_id=249078


in reply to Re: (Perl6) Groking Continuations (iterators)
in thread (Perl6) Groking Continuations

Or you use closures to turn call-backs into iterators. Here I've altered the API a smidge because the original code used chdir() during the loop which is probably an unexpected side-effect. For anyone that is interested - Dominus is writing an excellent book on iterators and it includes a section on transforming recursive calls somewhat thusly. Here's a link to the book's web page (which you must all now go out and buy (when it is published)).

BTW - this doesn't explain continuations at all - I'm just presenting a different perl5-accessible solution to the problem that tye posed.

my $find = find('', ''); while (my $file = $find->()) { print join('/', @$file)."\n"; } sub find { my @todo = shift; my @results; return sub { while (@todo and not @results) { my $subdir = shift @todo; $subdir = "." if ! defined $subdir or $subdir eq ''; $subdir .= "/" if $subdir =~ m{[^/]$}; my @files= ( glob("$subdir.*"), glob("$subdir*") ); for my $file ( @files ) { next if $file =~ /\.\.?$/; if( ! -l $file && -d _ ) { push @todo, \ $file; } push @results, [ $subdir, substr($file,length($subdir) +) ]; } } return shift @results; }; }