Acme-URM
view release on metacpan or search on metacpan
lib/Acme/URM.pm view on Meta::CPAN
package Acme::URM;
use strict;
use Data::Dumper;
our $VERSION = '0.02';
use constant LAST => -1;
use constant THIS => -2;
use constant MAX_STEPS => -3;
my $DEBUG = 0;
sub import {
foreach (@_) {
if(/^debug$/) {
$DEBUG = 1;
}
}
}
sub new {
my $class = shift;
my $self = {@_};
$self = bless $self, $class;
$self->_init();
$self
}
sub _init {
my $self = shift;
$self->{registers} = ();
$self->{program} = ();
$self->{instr_num} = 0;
$self->{max_steps} = -1; # infinite
}
sub program {
my $self = shift;
push @{$self->{program}}, @_ if scalar @_;
[$self->{program}]
}
sub clear_program {
my $self = shift;
$self->{program} = ();
}
sub register {
my $self = shift;
my $n = shift || 0;
my $i = $n;
foreach (@_) {
$self->{registers}[$i++] = $_;
}
(defined $self->{registers}[$n]) ? $self->{registers}[$n] : 0
}
sub clear_registers {
my $self = shift;
$self->{registers} = [];
}
sub clear {
my $self = shift;
$self->clear_program();
$self->clear_registers();
}
sub run {
my $self = shift;
$self->{instr_num} = 0;
$self->{steps_num} = 0;
my $run = 1;
do {
my $step = $self->_step();
return $step if MAX_STEPS == $step;
$run = (scalar(@{$self->{program}}) > $step) ? 1 : 0;
} while( $run );
_debug( "program executed",
"registers: " . Dumper([$self->{registers}]),
"",
);
$self->register(0)
}
( run in 0.958 second using v1.01-cache-2.11-cpan-7fcb06a456a )