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