Skip to content

Instantly share code, notes, and snippets.

@lifthrasiir
Created February 13, 2013 12:16
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 lifthrasiir/4944200 to your computer and use it in GitHub Desktop.
Save lifthrasiir/4944200 to your computer and use it in GitHub Desktop.
Brainf*ck in Rust (sort of, does not work)
struct tape { mem: ~[u8], ptr: uint }
pure fn tape() -> tape { tape { mem: vec::from_elem(10000u, 0u8), ptr: 0 } }
macro_rules! bf_rec(
() => ();
(+) => (tape.mem[tape.ptr] += 1u8);
(-) => (tape.mem[tape.ptr] -= 1u8);
(>) => (tape.ptr += 1u);
(<) => (tape.ptr -= 1u);
(.) => (io::stdout().write([tape.mem[tape.ptr]]));
(,) => ({ let c = io::stdin().read_byte();
if c >= 0 { tape.mem[tape.ptr] = c as u8; } });
(<<) => (bf_rec!(< <));
(>>) => (bf_rec!(> >));
(->) => (bf_rec!(- >));
(<-) => (bf_rec!(< -));
(<->) => (bf_rec!(< - >));
(..) => (bf_rec!(. .));
([ $($body)* ]) => (while tape.mem[tape.ptr] != 0u8 { bf_rec!($($body)*) });
($head:tt $($tail:tt)+) => ({ bf_rec!($head); bf_rec!($($tail)+); })
)
macro_rules! bf(
() => ();
($($x:tt)*) => ({ let mut tape = tape(); bf_rec!($($x)*); })
)
fn main() {
bf!(++++++++++++++++++++++++++++++++++++++++++..,.,.,.,.[.])
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment