1pub mod ast;
11pub mod builtins;
12pub mod cli;
13pub mod compiler;
14pub mod host;
15pub mod lexer;
16pub mod lsp;
17pub mod parser;
18
19pub use fusevm::Value;
20
21pub fn compile(src: &str) -> Result<compiler::Program, String> {
23 let stmts = parser::parse(src)?;
24 compiler::compile(&stmts)
25}
26
27pub fn load_merged(mut prog: compiler::Program) -> fusevm::Chunk {
31 let (func_off, try_off) = host::with_host(|h| h.program_offsets());
32 compiler::rebase_program(&mut prog, func_off, try_off);
33 let compiler::Program {
34 main,
35 functions,
36 tries,
37 } = prog;
38 let funcs: Vec<host::FuncDef> = functions.into_iter().map(|(_, f)| f).collect();
39 host::with_host(|h| h.load_program(funcs, tries));
40 main
41}
42
43pub fn run_compiled(prog: compiler::Program) -> Result<Value, String> {
45 host::run_main(load_merged(prog))
46}
47
48pub fn eval_str(src: &str) -> Result<Value, String> {
50 host::reset_host();
51 run_compiled(compile(src)?)
52}
53
54pub fn eval_file(path: &str) -> Result<Value, String> {
56 let src = std::fs::read_to_string(path).map_err(|e| format!("cannot read {path}: {e}"))?;
57 host::reset_host();
58 run_compiled(compile(&src)?)
59}