2 files changed,
40 insertions(+),
16 deletions(-)
Author:
Oleksandr Smirnov
olexsmir@gmail.com
Committed at:
2025-10-16 23:57:44 +0300
Change ID:
wzxvmmwnxlvmvxtqullzllnplktvttuv
Parent:
cccbd0e
jump to
| M | src/gbf.gleam |
| A | src/run.gleam |
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 +}