use strict; use warnings; use Stream; my $increment = sub { $_[ 0 ] + 1 }; my $upfrom2 = Stream::iterate_function( $increment, 2 ); my $primes = prime_filter( $upfrom2 ); my $n = shift || 1; print nth_term( $primes, $n ), "\n"; exit 0; sub nth_term { my ( $s, $n ) = @_; $s = Stream::tail $s while --$n > 0; return Stream::head $s; } # a closure factory sub not_multiple_of { my $d = shift; return sub { $_[ 0 ] % $d }; } sub prime_filter { my $s = shift; # a stream my $p = Stream::head $s; # a "simple scalar" my $t = Stream::tail $s; # another stream my $not_multiple_of_p = not_multiple_of( $p ); return [ $p, sub { prime_filter( &Stream::filter( $not_multiple_of_p, $t ) ); } ]; } #### % perl sieve.pl 97 509 % perl sieve.pl 98 Deep recursion on subroutine "Stream::tail" at Stream.pm line 90. Deep recursion on subroutine "Stream::tail" at Stream.pm line 90. 521 #### node(head($s), promise { filter($f, tail($s)) }); #### node( head( $s ), promise { $s->[ 1 ] = $s->[ 1 ]->() if is_promise $s->[ 1 ]; filter( $f, $s->[ 1 ] ) } ); #### --- Stream.pm.orig Tue May 3 16:41:37 2005 +++ Stream.pm Mon Aug 29 20:00:14 2005 @@ -11,13 +11,16 @@ ## Chapter 6 section 2 +use strict; +use warnings; + package Stream; -use base Exporter; -@EXPORT_OK = qw(node head tail drop upto upfrom show promise +use base 'Exporter'; +@Stream::EXPORT_OK = qw(node head tail drop upto upfrom show promise filter transform merge list_to_stream cutsort iterate_function cut_loops); -%EXPORT_TAGS = ('all' => \@EXPORT_OK); +%Stream::EXPORT_TAGS = ('all' => \@Stream::EXPORT_OK); sub node { my ($h, $t) = @_; @@ -29,13 +32,13 @@ $s->[0]; } -sub tail { - my ($s) = @_; - if (is_promise($s->[1])) { - return $s->[1]->(); - } - $s->[1]; -} +# sub tail { +# my ($s) = @_; +# if (is_promise($s->[1])) { +# return $s->[1]->(); +# } +# $s->[1]; +# } sub is_promise { UNIVERSAL::isa($_[0], 'CODE'); #### return Stream::node ( $p, Stream::promise { prime_filter( &Stream::filter( $not_multiple_of_p, $t ) ); } );