all repos

gbf @ ef6aac38f6ecad66bdfc2eb5bd9d6e060fa9c1b4

⭐ gleaming brainfuck
2 files changed, 40 insertions(+), 16 deletions(-)
make it act as a lib
Author: Oleksandr Smirnov olexsmir@gmail.com
Committed at: 2025-10-16 23:57:44 +0300
Change ID: wzxvmmwnxlvmvxtqullzllnplktvttuv
Parent: cccbd0e
M src/gbf.gleam

@@ -2,31 +2,42 @@ import char

import gbf/eval import gbf/lexer import gbf/parser -import gbf/vm -import gleam/io +import gbf/vm.{type VirtualMachine} import gleam/list import gleam/result import gleam/string -pub fn main() { - let input = - "++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++." +pub type Error { + Parser(parser.Error) + Eval(eval.Error) +} +pub fn run(source: String) -> Result(VirtualMachine, Error) { let vm = - input + source |> string.split(on: "") |> list.map(char.to_code) |> vm.new - let ast = input |> lexer.new() |> lexer.lex |> parser.parse() - case ast { - Error(_) -> panic as "not yay failed" - Ok(ast) -> { - use res <- result.try(eval.eval(vm, ast)) - io.println("input: " <> input) - io.println("input: " <> res.output) + use ast <- result.try(parse_ast(source)) + use vm <- result.try(eval_ast(vm, ast)) + + Ok(vm) +} + +pub fn output(vm: VirtualMachine) -> String { + vm.output +} + +fn parse_ast(source: String) { + source + |> lexer.new + |> lexer.lex + |> parser.parse + |> result.map_error(fn(e) { Parser(e) }) +} - Ok("") - } - } +fn eval_ast(vm, ast) { + eval.eval(vm, ast) + |> result.map_error(fn(e) { Eval(e) }) }
A src/run.gleam

@@ -0,0 +1,13 @@

+import gbf +import gleam/io + +pub fn main() -> Nil { + let input = + "++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++." + + let assert Ok(vm) = gbf.run(input) + + vm + |> gbf.output + |> io.println +}