1
use crate::ast::{Expr, Program};
2
use crate::compiler::expr::{eval_value, format_expr};
3
use crate::error::{Error, Result};
4
use crate::runtime::{SymbolTable, Value};
5

            
6
2584
pub fn eval_program(symbols: &mut SymbolTable, program: &Program) -> Result<Value> {
7
2584
    if program.exprs.is_empty() {
8
        return Ok(Value::Nil);
9
2584
    }
10
3264
    for expr in &program.exprs[..program.exprs.len() - 1] {
11
3264
        eval_value(symbols, expr)?;
12
    }
13
2550
    let value = eval_value(symbols, program.exprs.last().unwrap())?;
14
2210
    expr_to_value(&value)
15
2584
}
16

            
17
2210
fn expr_to_value(expr: &Expr) -> Result<Value> {
18
2210
    match expr {
19
238
        Expr::Nil => Ok(Value::Nil),
20
544
        Expr::Bool(b) => Ok(Value::Bool(*b)),
21
442
        Expr::Number(n) => Ok(Value::Number(*n)),
22
102
        Expr::String(s) => Ok(Value::String(s.clone())),
23
34
        Expr::Symbol(s) => Ok(Value::Symbol(s.clone())),
24
714
        Expr::Quote(inner) => quoted_to_value(inner),
25
68
        Expr::List(_) => Ok(Value::String(format_expr(expr))),
26
        Expr::Lambda(_, _) => Ok(Value::String(format_expr(expr))),
27
68
        Expr::RuntimeValue(val) => Ok(val.clone()),
28
        _ => Err(Error::Compile(format!("unsupported expression: {expr:?}"))),
29
    }
30
2210
}
31

            
32
714
fn quoted_to_value(inner: &Expr) -> Result<Value> {
33
714
    match inner {
34
        Expr::Nil => Ok(Value::Nil),
35
        Expr::Bool(b) => Ok(Value::Bool(*b)),
36
        Expr::Number(n) => Ok(Value::Number(*n)),
37
        Expr::String(s) => Ok(Value::String(s.clone())),
38
272
        Expr::Symbol(s) => Ok(Value::Symbol(s.clone())),
39
442
        Expr::List(elems) => {
40
442
            let inner: Vec<_> = elems.iter().map(format_expr).collect();
41
442
            Ok(Value::String(format!("({})", inner.join(" "))))
42
        }
43
        _ => Err(Error::Compile(format!(
44
            "unsupported quoted expression: {inner:?}"
45
        ))),
46
    }
47
714
}