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; }; }
|
---|
Replies are listed 'Best First'. | |
---|---|
Re: Re: Re: (Perl6) Groking Continuations (iterators)
by oylee (Pilgrim) on Apr 08, 2003 at 23:17 UTC | |
by Anonymous Monk on Oct 23, 2010 at 04:58 UTC | |
Re^3: (Perl6) Groking Continuations (_!)
by tye (Sage) on Apr 08, 2003 at 21:45 UTC | |
by Dominus (Parson) on Apr 09, 2003 at 17:36 UTC | |
by Aristotle (Chancellor) on Apr 13, 2003 at 18:04 UTC |
In Section
Seekers of Perl Wisdom