Execute Brain****/Raku: Difference between revisions
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. |
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. |
@!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 |
@!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>