pub mod ast;
pub mod builtins;
pub mod cli;
pub mod compiler;
pub mod host;
pub mod lexer;
pub mod lsp;
pub mod parser;
pub use fusevm::Value;
pub fn compile(src: &str) -> Result<compiler::Program, String> {
let stmts = parser::parse(src)?;
compiler::compile(&stmts)
}
pub fn load_merged(mut prog: compiler::Program) -> fusevm::Chunk {
let (func_off, try_off) = host::with_host(|h| h.program_offsets());
compiler::rebase_program(&mut prog, func_off, try_off);
let compiler::Program {
main,
functions,
tries,
} = prog;
let funcs: Vec<host::FuncDef> = functions.into_iter().map(|(_, f)| f).collect();
host::with_host(|h| h.load_program(funcs, tries));
main
}
pub fn run_compiled(prog: compiler::Program) -> Result<Value, String> {
host::run_main(load_merged(prog))
}
pub fn eval_str(src: &str) -> Result<Value, String> {
host::reset_host();
run_compiled(compile(src)?)
}
pub fn eval_file(path: &str) -> Result<Value, String> {
let src = std::fs::read_to_string(path).map_err(|e| format!("cannot read {path}: {e}"))?;
host::reset_host();
run_compiled(compile(&src)?)
}