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 ) );
}
);