#interpreter #brainfuck #alloc #std #memory #input

no-std bfcore

一个不使用 std 或 alloc 的 BrainF*ck 解释器

4 个版本

0.2.0 2019 年 8 月 14 日
0.1.2 2019 年 8 月 14 日
0.1.1 2019 年 8 月 14 日
0.1.0 2019 年 8 月 13 日

#293 in FFI

26 每月下载量
bfcomp 中使用

MIT 许可证

13KB
148

bfcore

一个不使用 std 或 alloc 的 BrainF*ck 解释器。

为什么?

现在您可以在任何您想要的硬件上运行 brainf*ck。这个库甚至不需要内存分配器!

用法

以下是如何使用 bfcore 运行 brainf*ck 的最小示例。

extern crate bfcore;
use bfcore::{Interpreter, Input, Output};

#[derive(Default)]
struct In; impl Input for In {}
#[derive(Default)]
struct Out; impl Output for Out {}


fn main() {
    Interpreter::new(
        "+[----->+++<]>+.---.+++++++..+++.",
        &mut In::default(),
        &mut Out::default()
    ).run();
}

但这并没有真正展示什么。

让我更明确一点。

extern crate bfcore;
use bfcore::{Interpreter, Input, Output};

#[derive(Default)]
struct In;
impl Input for In {
    fn input(&mut self) -> char {
        // When the interpreter needs user input, return EOF, or '\0'
        '\0'
    }
}

#[derive(Default)]
struct Out;
impl Output for Out {
    fn output(&mut self, ch: char) {
        // When the interpreter wants to output, print the output character
        print!("{}", ch);
    }
}


fn main() {
    Interpreter::new(
        "+[----->+++<]>+.---.+++++++..+++.",
        &mut In::default(),
        &mut Out::default()
    ).run();
}

Input trait 允许您向解释器提供输入,而 Output trait 允许它输出到您想要的位置。

输入和输出对象也可以保持状态,例如缓冲区。

extern crate bfcore;
use bfcore::{Input, Interpreter, Output};
use std::io::stdin;



/// Captures input from commandline as needed.
#[derive(Default)]
struct MyInput { buffer: String }
impl Input for MyInput {
    fn input(&mut self) -> char {
        // Only get user input if we've run out of characters in our buffer
        if self.buffer.is_empty() {
            stdin()
                .read_line(&mut self.buffer)
                .expect("Did not enter a correct string");
        }

        let result = self.buffer.chars().nth(0);
        if !self.buffer.is_empty() {
            self.buffer = self.buffer[1..].to_string();
        }

        match result {
            Some(ch) => ch,
            None => 0 as char,
        }
    }
}


#[derive(Default)]
struct MyOutput;
impl Output for MyOutput {
    fn output(&mut self, ch: char) {
        print!("{}", ch);
    }
}

fn main() {
    // Create an interpreter with a program that prints hello world
    // Give it instances of our input and output structs
    Interpreter::new(
        r#"+[----->+++<]>+.---.+++++++..+++."#,
        &mut MyInput::default(),
        &mut MyOutput::default()
    ).run(); // Run the interpreter
}

我没有这个示例,但您甚至可以使用输出非打印字符来改变输入和输出对象的状态以执行不同的操作。您可以输出特殊字符来切换模式,将它们切换到写入文件或屏幕,等等。

无运行时依赖