1#![no_std]
14
15extern crate alloc;
16#[cfg(feature = "stats-env")]
17extern crate std;
18
19mod ast;
20mod builtins;
21mod eval;
22mod eval_env;
23mod eval_match;
24mod load;
25mod module;
26mod parse;
27mod resolve;
28mod value;
29
30pub use ast::{Expr, HomeLeaf, ModuleData, Pattern, ProtoRef, Text, TyKind};
31pub use eval::{
32 apply, apply_with, eval, eval_env, eval_main, instantiate, Builtin, Ctx, Env, EnvNode, EnvRef,
33 HostCall, HostFn, ObjectData, Raised, Value,
34};
35#[cfg(feature = "stats-env")]
36pub use eval_env::stats_env;
37pub use load::{load_module, load_module_source, Instances, LoadError, ModuleResolver, Resolved};
38pub use module::{compile_module_framed, compile_module_named, ImportDecl, ImportSpec, ModuleName};
39pub use parse::{is_bindable_name, parse_module, parse_program, ParseError};
40pub use resolve::{resolve, resolve_module_bodies, resolve_open, resolve_prelude};
41
42use alloc::rc::Rc;
43
44#[derive(Debug, Clone, PartialEq, Eq)]
48pub enum Error {
49 Syntax(muon::ParseError),
51 Parse(ParseError),
53}
54
55pub fn parse(src: &str) -> Result<Expr, Error> {
58 let mut expr = parse_open(src)?;
59 resolve(&mut expr).map_err(Error::Parse)?;
60 Ok(expr)
61}
62
63pub fn parse_open(src: &str) -> Result<Expr, Error> {
66 let seq = muon::parse(src).map_err(Error::Syntax)?;
67 parse_program(&seq).map_err(Error::Parse)
68}
69
70pub fn compile_module(src: &str) -> Result<Rc<ModuleData>, Error> {
76 compile_module_framed(src, &[])
77}
78
79pub fn parse_preluded(src: &str, prelude: &[Text]) -> Result<Expr, Error> {
82 let mut expr = parse_open(src)?;
83 resolve_prelude(&mut expr, prelude).map_err(Error::Parse)?;
84 Ok(expr)
85}