brainfuck_macros

A compiler plugin that converts brainfuck code into Rust at compile time, letting your BF programs be optimised by LLVM to super-fast native code.


Keywords
plugin, esolang
Licenses
MIT/Apache-2.0

Contributors

Huon Wilson


See all contributors


Documentation

Build Status

A simple procedural macro that turns a Brainfuck program into native code.

Example:

#![feature(phase)]

#[phase(plugin)] extern crate brainfuck_macros;

use std::io;

fn main() {
    let hello_world = brainfuck!{
        ++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>
        ---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.
    };

    hello_world(&mut io::stdin(), &mut io::stdout()).unwrap();
}

See tests/ and examples/ for some basic examples and the bf_bf_interpreter subpackage for brainfuck interpreter written in brainfuck.

This is Cargo enabled, and so can be used by adding a [dependencies.brainfuck_macros] section pointing to this git repository to your Cargo.toml. If you wish to also use bf_bf_interpreter, simply add [dependencies.bf_bf_interpreter] section also pointing to this repository.

Specs

Normal brainfuck, with:

  • a tape length of 30000,
  • cells storing unsigned bytes (with wrapping),
  • EOF indicated by returning -1, and
  • out-of-bounds index steps ignored (i.e. < when pointing at the first cell is just ignored, and similarly for > at the last).