compose_eval/expression/
mod.rs1use crate::vm::{Machine, Tracked};
2use crate::{Eval, Evaluated};
3use compose_library::diag::{SourceResult};
4use compose_syntax::ast::{AstNode, Expr};
5
6mod assignment;
7mod atomic;
8mod binary;
9mod bindings;
10mod block;
11mod call;
12mod closure;
13mod control_flow;
14mod field_access;
15mod parenthesized;
16mod path_access;
17mod unary;
18mod array;
19mod range;
20mod map;
21
22pub use closure::eval_lambda;
23
24impl Eval for Expr<'_> {
25 fn eval(self, vm: &mut Machine) -> SourceResult<Evaluated> {
26 let span = self.span();
27 let v = match self {
28 Expr::Int(i) => i.eval(vm),
29 Expr::Binary(b) => b.eval(vm),
30 Expr::LetBinding(l) => l.eval(vm),
31 Expr::Ident(i) => i.eval(vm),
32 Expr::CodeBlock(c) => c.eval(vm),
33 Expr::Unit(_) => Ok(Evaluated::unit()),
34 Expr::Str(s) => s.eval(vm),
35 Expr::Unary(u) => u.eval(vm),
36 Expr::Bool(b) => b.eval(vm),
37 Expr::FuncCall(f) => f.eval(vm),
38 Expr::FieldAccess(f) => f.eval(vm),
39 Expr::PathAccess(p) => p.eval(vm),
40 Expr::Parenthesized(p) => p.eval(vm),
41 Expr::Conditional(c) => c.eval(vm),
42 Expr::WhileLoop(w) => w.eval(vm),
43 Expr::ForLoop(f) => f.eval(vm),
44 Expr::Array(a) => a.eval(vm),
45 Expr::Range(r) => r.eval(vm),
46 Expr::Map(m) => m.eval(vm),
47 Expr::Lambda(l) => l.eval(vm),
48 }?
49 .spanned(span)
50 .track_tmp_root(vm);
51
52 Ok(v)
53 }
54}