Skip to content

Instantly share code, notes, and snippets.

@tuchida
Forked from tuchida/brainfuck.js
Last active December 14, 2015 19:39
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tuchida/5138252 to your computer and use it in GitHub Desktop.
Save tuchida/5138252 to your computer and use it in GitHub Desktop.
macro bf {
case : { $body ... } => {
(function() {
var env = {
p: 0,
b: [],
buf: new Buffer(1)
};
bf_tokenizer[env]($body ...);
})();
}
}
macro bf_tokenizer {
case [$env]($head) => {
bf_evaluator[$env]($head)
}
case [$env]($head $rest ...) => {
bf_evaluator[$env]($head)
bf_tokenizer[$env]($rest ...)
}
}
macro bf_evaluator {
case [$env](>) => {
$env.p++;
}
case [$env](<) => {
$env.p--;
}
case [$env](+) => {
$env.b[$env.p] = -~$env.b[$env.p];
}
case [$env](-) => {
$env.b[$env.p] = ~-$env.b[$env.p];
}
case [$env](.) => {
process.stdout.write(String.fromCharCode($env.b[$env.p]));
}
case [$env](,) => {
if (require('fs').readSync(process.stdin.fd, $env.buf, 0, 1) > 0) { $env.b[$env.p] = $env.buf[0]; }
}
case [$env]([]) => {
while ($env.b[$env.p]) {}
}
case [$env]([$body ...]) => {
while ($env.b[$env.p]) {
bf_tokenizer[$env]($body ...);
}
}
case [$env](>>) => {
bf_evaluator[$env](>)
bf_evaluator[$env](>)
}
case [$env](>>>) => {
bf_evaluator[$env](>)
bf_evaluator[$env](>)
bf_evaluator[$env](>)
}
case [$env](<<) => {
bf_evaluator[$env](<)
bf_evaluator[$env](<)
}
case [$env](++) => {
bf_evaluator[$env](+)
bf_evaluator[$env](+)
}
case [$env](--) => {
bf_evaluator[$env](-)
bf_evaluator[$env](-)
}
case [$env](... $rest ...) => {
bf_evaluator[$env](.)
bf_evaluator[$env](.)
bf_evaluator[$env](.)
}
}
bf: {
+++++++++[>++++++++>+++++++++++>+++++<<<-]>.>++.+++++++..+++.>-.
------------.<++++++++.--------.+++.------.--------.>+.
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment