Skip to content

Instantly share code, notes, and snippets.

@permil
Last active July 30, 2018 11:25
Show Gist options
  • Save permil/ffded74568a4a697a1f1a5a67e720952 to your computer and use it in GitHub Desktop.
Save permil/ffded74568a4a697a1f1a5a67e720952 to your computer and use it in GitHub Desktop.
bf interpreter written in Perl 6
use v6;
class Brainfuck {
method run($prog) {
my @prog = $prog.comb(/./);
my $p_ptr = 0;
my @tape = ();
my $ptr = 0;
while @prog[$p_ptr] -> $char {
given $char {
when '>' { $ptr++ }
when '<' { $ptr-- }
when '+' { @tape[$ptr]++ }
when '-' { @tape[$ptr]-- }
when '.' { print chr(@tape[$ptr]); }
when ',' { @tape[$ptr] = $*STDIN.getc }
when '[' { $p_ptr = self!find_closing_bracket(@prog, $p_ptr) if @tape[$ptr] == 0 }
when ']' { $p_ptr = self!find_opening_bracket(@prog, $p_ptr) if @tape[$ptr] != 0 }
}
$p_ptr++;
}
}
method !find_bracket(@prog, $p_ptr is copy, $b1, $b2, $direction) {
my $count = 1;
while $count {
$p_ptr += $direction;
given @prog[$p_ptr] {
when $b2 { $count++ }
when $b1 { $count-- }
when :!defined { die("couldn't find the corresponding bracket") }
}
}
$p_ptr;
}
method !find_opening_bracket(@prog, $p_ptr) {
self!find_bracket(@prog, $p_ptr, '[', ']', -1);
}
method !find_closing_bracket(@prog, $p_ptr) {
self!find_bracket(@prog, $p_ptr, ']', '[', 1);
}
}
my $bf = Brainfuck.new();
$bf.run('>+++++++++[<++++++++>-]<.>+++++++[<++++>-]<+.+++++++..+++.[-]>++++++++[<++++>-]<.>+++++++++++[<+++++>-]<.>++++++++[<+++>-]<.+++.------.--------.[-]>++++++++[<++++>-]<+.[-]++++++++++.');
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment