驚いた素数

とても驚いた素数の数え上げ。

Perlに移してみました。

use strict;
use warnings;
#
# See:
# http://log.ttsky.net/article/19432981.html
# http://www.nslabs.jp/haskell_vs_ruby.rhtml
#
package Local::Prime;
use bignum;

sub new {
	return bless {
		hash => {},
		n    => 1,
	}, shift;
}

sub iter {
	my ($self) = @_;

	while(1){
		$self->{n}++;
		my $proc = $self->{hash}->{$self->{n}};
		if (defined $proc){
			$proc->();
			delete $self->{hash}->{$self->{n}};
			next;
		}

		my $m = $self->{n};
		my $n = $self->{n};

		my $next_proc;
		$next_proc = sub {
			$m += $n;
			my $proc = $self->{hash}->{$m};
			$proc->() if (defined $proc);
			$self->{hash}->{$m} = $next_proc;
		};
		$next_proc->();

		return $self->{n};
	}
}

package main;

my $prime = Local::Prime->new;
foreach(0..14){
	print $prime->iter, "\n";
}

関数型の発想方法なんでしょうか。衝撃を受けました。