Execute Brain****/Raku: Difference between revisions

From Rosetta Code
Content added Content deleted
(added perl6)
 
(prefer comb over split; fix private method call syntax)
Line 8: Line 8:


method new (Str $code) {
method new (Str $code) {
BFInterpreter.bless(*,code => $code.lines.split(""));
BFInterpreter.bless(*,code => $code.lines.comb);
}
}


Line 14: Line 14:
$!c = 0;
$!c = 0;
$!m = 0;
$!m = 0;
while $!c < @!code
while $!c < @!code {
{
given @!code[$!c] {
given @!code[$!c] {
when '>' { $!m++ }
when '>' { $!m++ }
Line 23: Line 22:
when '.' { @!mem[$!m].chr.print }
when '.' { @!mem[$!m].chr.print }
when ',' {
when ',' {
@!input_buffer = $*IN.get.split("") unless @!input_buffer.elems > 0;
@!input_buffer = $*IN.get.comb unless @!input_buffer.elems > 0;
@!mem[$!m] = @!input_buffer.shift;
@!mem[$!m] = @!input_buffer.shift;
}
}
when '[' {
when '[' {
@!mem[$!m] == 0 ?? jump() !! @!loop_stack.push($!c);
@!mem[$!m] == 0 ?? self!jump !! @!loop_stack.push($!c);
}
}
when ']' {
when ']' {

Revision as of 23:08, 16 September 2010

<lang perl6>class BFInterpreter {

   has @!code;
   has @!mem;
   has @!loop_stack;
   has @!input_buffer;
   has $!m;
   has $!c;
   method new (Str $code) {
       BFInterpreter.bless(*,code => $code.lines.comb);
   }
   method run {
       $!c = 0;
       $!m = 0;
       while $!c < @!code {
           given @!code[$!c] {
               when '>' { $!m++ }
               when '<' { $!m-- }
               when '+' { @!mem[$!m]++ }
               when '-' { @!mem[$!m]-- }
               when '.' { @!mem[$!m].chr.print }
               when ',' {
                   @!input_buffer = $*IN.get.comb unless @!input_buffer.elems > 0;
                   @!mem[$!m] = @!input_buffer.shift;
               }
               when '[' {
                   @!mem[$!m] == 0 ?? self!jump !! @!loop_stack.push($!c);
               }
               when ']' {
                   my $b = @!loop_stack.pop - 1;
                   $!c = $b if @!mem[$!m] > 0;
               }
           }

$!c++;

       }
   }
   method !jump {
       my $depth = 1;
       while $depth {
           $!c++;
           die "unbalanced code" if $!c >= @!code.elems;
           $!depth++ if @!code[$!c] eq '[';
           $!depth-- if @!code[$!c] eq ']';
       }
   }

}</lang>

Test: "Hello World" program: <lang perl6> my $code = "++++++++++

          [>+++++++>++++++++++>+++>+<<<<-]
          >++.>+.+++++++..+++.>++.<<+++++++++++++++.>.
          +++.------.--------.>+.>.";

my $bfi = BFInterpreter.new($code); $bfi.run; </lang>