1use super::*;
2
3impl Interpreter {
4 pub fn exec_items(&mut self, items: &[TopLevel]) -> Result<Value, RuntimeError> {
5 for item in items {
6 match item {
7 TopLevel::FnDef(fd) => self.exec_fn_def(fd)?,
8 TopLevel::Module(_) => {}
9 TopLevel::Verify(_) => {}
10 TopLevel::Decision(_) => {}
11 TopLevel::TypeDef(td) => self.register_type_def(td),
12 TopLevel::Stmt(s) => {
13 self.exec_stmt(s)?;
14 }
15 }
16 }
17 Ok(Value::Unit)
18 }
19
20 pub fn register_type_def(&mut self, td: &TypeDef) {
22 match td {
23 TypeDef::Sum {
24 name: type_name,
25 variants,
26 ..
27 } => {
28 let mut members = HashMap::new();
29 for variant in variants {
30 if variant.fields.is_empty() {
31 members.insert(
33 variant.name.clone(),
34 Value::Variant {
35 type_name: type_name.clone(),
36 variant: variant.name.clone(),
37 fields: vec![].into(),
38 },
39 );
40 } else {
41 members.insert(
43 variant.name.clone(),
44 Value::Builtin(format!("__ctor:{}:{}", type_name, variant.name)),
45 );
46 }
47 }
48 self.define(
49 type_name.clone(),
50 Value::Namespace {
51 name: type_name.clone(),
52 members,
53 },
54 );
55 }
56 TypeDef::Product { name, fields, .. } => {
57 let schema = fields.iter().map(|(field, _)| field.clone()).collect();
61 self.record_schemas.insert(name.clone(), schema);
62 }
63 }
64 }
65
66 pub fn exec_fn_def(&mut self, fd: &FnDef) -> Result<(), RuntimeError> {
67 let val = Value::Fn(Rc::new(crate::value::FunctionValue {
68 name: Rc::new(fd.name.clone()),
69 params: Rc::new(fd.params.clone()),
70 return_type: Rc::new(fd.return_type.clone()),
71 effects: Rc::new(fd.effects.clone()),
72 body: Rc::clone(&fd.body),
73 lowered_body: super::lowered::lower_fn_body(fd.body.as_ref()),
74 resolution: fd.resolution.clone(),
75 memo_eligible: self.memo_fns.contains(&fd.name),
76 home_globals: None,
77 }));
78 self.define(fd.name.clone(), val);
79 Ok(())
80 }
81
82 pub fn exec_stmt(&mut self, stmt: &Stmt) -> Result<Value, RuntimeError> {
83 match stmt {
84 Stmt::Binding(name, _, expr) => {
85 let val = self.eval_expr(expr)?;
86 self.define(name.clone(), val);
87 Ok(Value::Unit)
88 }
89 Stmt::Expr(expr) => self.eval_expr(expr),
90 }
91 }
92
93 pub fn exec_body(&mut self, stmts: &[Stmt]) -> Result<Value, RuntimeError> {
94 let mut last = Value::Unit;
95 for stmt in stmts {
96 last = self.exec_stmt(stmt)?;
97 }
98 Ok(last)
99 }
100
101 pub fn run_file(&mut self, source: &str) -> Result<Value, RuntimeError> {
102 let mut items = parse_source(source).map_err(RuntimeError::Error)?;
103 crate::resolver::resolve_program(&mut items);
104
105 for item in &items {
107 match item {
108 TopLevel::FnDef(fd) => self.exec_fn_def(fd)?,
109 TopLevel::Stmt(s) => {
110 self.exec_stmt(s)?;
111 }
112 _ => {}
113 }
114 }
115
116 let main_fn = self.lookup("main");
118 if let Ok(fn_val) = main_fn {
119 let allowed = Self::callable_declared_effects(&fn_val);
120 self.call_value_with_effects_pub(fn_val, vec![], "<main>", allowed)?;
121 }
122
123 Ok(Value::Unit)
124 }
125}