let ( let* ) = Result.bind module Error = Error module Expr = Expr module Interpreter = Interpreter module Lexer = Lexer module Parser = Parser module Stmt = Stmt type lox_error = Error.lox_error let run (source : string) : (unit, lox_error) result = let* tokens = Error.of_lexer_error (Lexer.tokenize source) in (* let f token = Printf.printf "%s " (Lexer.show_token token) in Printf.printf "Got %d tokens\n" (List.length tokens); List.iter f tokens; print_newline (); *) let* ast = Error.of_parser_error (Parser.parse tokens) in (* Printf.printf "%s\n" (Expr.show_expr expr); *) (* let* value = Error.of_interpreter_error (Interpreter.interpret_expr ast) in print_endline (Value.string_of_lox_value value); *) let rec interpret_stmts (stmts : Stmt.stmt_node list) = match stmts with | [] -> Ok () | stmt :: tail -> let* _ = Interpreter.interpret_stmt stmt in interpret_stmts tail in interpret_stmts ast |> Error.of_runtimer_error let runRepl () : unit = try while true do print_string "> "; let line = read_line () in let result = run line in Result.iter_error Error.print_error result done with End_of_file -> ()